调用std::variant保存的所有类型的成员函数?



我有一个如下类型的变量:

std::variant<std::monostate, first_custom_type, second_custom_type> var;

,其中first_custom_typesecond_custom_type都有一个名为func()的函数,我想在创建var后执行该函数。

是否有一种方法可以调用func()而不必检查var持有的类型(例如,与std::get)?

这可以很容易地使用std::visit完成。唯一的例外是std::monostate,但它可以很容易地通过overlodedhelper结构体(上面的链接中有一个例子)来避免。

struct s1{
void func()
{
std::cout << "1";
}
};
struct s2{
void func()
{
std::cout << "2";
}
};
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
// explicit deduction guide (not needed as of C++20)
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
int main()
{
std::variant<s1, s2, std::monostate> var1 = s1{};
std::variant<s1, s2, std::monostate> var2 = s2{};
std::variant<s1, s2, std::monostate> var3 = std::monostate{};
auto functor = overloaded {
[](std::monostate) {}, 
[](auto& arg) {arg.func();}
};
std::visit(functor, var1); // 1
std::visit(functor, var2); // 2
std::visit(functor, var3); // nothing
}