#include <iomanip>
#include <iostream>
#include <string>
#include <type_traits>
#include <variant>
#include <vector>
using value_t = std::variant<int, long, double, std::basic_string<char>>;
template<class ... Ts>
struct overloaded : public Ts... {
using Ts::operator()...;
};
#ifdef INSIGHTS_USE_TEMPLATE
template<>
struct overloaded<__lambda_57_13, __lambda_58_13, __lambda_59_13> : public __lambda_57_13, public __lambda_58_13, public __lambda_59_13 {
using __lambda_57_13::operator();
template<class type_parameter_0_0>
inline auto::operator()(type_parameter_0_0 arg) const {
(std::cout << arg) << ' ';
}
#ifdef INSIGHTS_USE_TEMPLATE
template<>
inline void::operator()<int>(int arg) const {
std::operator<<(std::cout.operator<<(arg), ' ');
}
#endif
#ifdef INSIGHTS_USE_TEMPLATE
template<>
inline void::operator()<long>(long arg) const {
std::operator<<(std::cout.operator<<(arg), ' ');
}
#endif
...
template<class ... Ts>
overloaded(Ts...)-> overloaded<Ts...>;
#ifdef INSIGHTS_USE_TEMPLATE
template<>
overloaded(__lambda_57_13 __0, __lambda_58_13 __1, __lambda_59_13 __2)-> overloaded<__lambda_57_13, __lambda_58_13, __lambda_59_13>;
#endif
int main() {
std::vector<std::variant<int, long, double, std::basic_string<char>>, std::allocator<std::variant<int, long, double, std::basic_string<char>>>> vec = std::vector<std::variant<int, long, double, std::basic_string<char>>, std::allocator<std::variant<int, long, double, std::basic_string<char>>>>{
std::initializer_list<std::variant<int, long, double, std::basic_string<char>>>{
std::variant<int, long, double, std::basic_string<char>>(10),
std::variant<int, long, double, std::basic_string<char>>(15L),
std::variant<int, long, double, std::basic_string<char>>(1.5),
std::variant<int, long, double, std::basic_string<char>>("hello")
},
std::allocator<std::variant<int, long, double, std::basic_string<char>>>()
};
{
std::vector<std::variant<int, long, double, std::basic_string<char>>, std::allocator<std::variant<int, long, double, std::basic_string<char>>>>& __range1 = vec;
__gnu_cxx::__normal_iterator<std::variant<int, long, double, std::basic_string<char>>*, std::vector<std::variant<int, long, double, std::basic_string<char>>, std::allocator<std::variant<int, long, double, std::basic_string<char>>>>> __begin1 = __range1.begin();
__gnu_cxx::__normal_iterator<std::variant<int, long, double, std::basic_string<char>>*, std::vector<std::variant<int, long, double, std::basic_string<char>>, std::allocator<std::variant<int, long, double, std::basic_string<char>>>>> __end1 = __range1.end();
for(; __gnu_cxx::operator!=(__begin1, __end1); __begin1.operator++()) {
std::variant<int, long, double, std::basic_string<char>>& v = __begin1.operator*();
class __lambda_25_20 {
public:
template<class type_parameter_0_0>
inline auto operator()(type_parameter_0_0 && arg) const {
std::cout << arg;
}
#ifdef INSIGHTS_USE_TEMPLATE
template<>
inline void operator()<int&>(int& arg) const {
std::cout.operator<<(arg);
}
#endif
...
private:
template<class type_parameter_0_0>
static inline auto __invoke(type_parameter_0_0 && arg) {
return __lambda_25_20{}.operator()<type_parameter_0_0>(arg);
}
};
std::visit(__lambda_25_20{}, v);
class __lambda_28_32 {
public:
template<class type_parameter_0_0>
inline std::variant<int, long, double, std::basic_string<char>> operator()(type_parameter_0_0 && arg) const {
return arg + arg;
}
#ifdef INSIGHTS_USE_TEMPLATE
template<>
inline std::variant<int, long, double, std::basic_string<char>> operator()<int&>(int& arg) const {
return std::variant<int, long, double, std::basic_string<char>>(arg + arg);
}
#endif
#ifdef INSIGHTS_USE_TEMPLATE
template<>
inline std::variant<int, long, double, std::basic_string<char>> operator()<long&>(long& arg) const {
return std::variant<int, long, double, std::basic_string<char>>(arg + arg);
}
#endif
...
private:
template<class type_parameter_0_0>
static inline std::variant<int, long, double, std::basic_string<char>> __invoke(type_parameter_0_0 && arg) {
return __lambda_28_32{}.operator()<type_parameter_0_0>(arg);
}
};
std::variant<int, long, double, std::basic_string<char>> w = std::visit(__lambda_28_32{}, v);
std::operator<<(std::cout, ". After doubling, variant holds ");
class __lambda_32_20 {
public:
template<class type_parameter_0_0>
inline auto operator()(type_parameter_0_0 && arg) const {
using T = std::decay_t<decltype(arg)>;
if constexpr(std::is_same_v<T, int>) {
(std::operator<<(std::cout, "int with value ") << arg) << '\n';
} else {
if constexpr(std::is_same_v<T, long>) {
(std::operator<<(std::cout, "long with value ") << arg) << '\n';
} else {
if constexpr(std::is_same_v<T, double>) {
(std::operator<<(std::cout, "double with value ") << arg) << '\n';
} else {
if constexpr(std::is_same_v<T, std::basic_string<char>>) {
(std::operator<<(std::cout, "std::string with value ") << std::quoted(arg)) << '\n';
} else {
;
}
}
}
}
}
...
private:
template<class type_parameter_0_0>
static inline auto __invoke(type_parameter_0_0 && arg) {
return __lambda_32_20{}.operator()<type_parameter_0_0>(arg);
}
};
std::visit(__lambda_32_20{}, w);
}
}
...
return 0;
}