我有一个如下类型的变量:
std::variant<std::monostate, first_custom_type, second_custom_type> var;
,其中first_custom_type
和second_custom_type
都有一个名为func()
的函数,我想在创建var
后执行该函数。
是否有一种方法可以调用func()
而不必检查var
持有的类型(例如,与std::get
)?
这可以很容易地使用std::visit
完成。唯一的例外是std::monostate
,但它可以很容易地通过overloded
helper结构体(上面的链接中有一个例子)来避免。
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
}