gpt4 book ai didi

c++ - 调用 std::variant 持有的所有类型的成员函数?

转载 作者:行者123 更新时间:2023-12-05 04:28:16 29 4
gpt4 key购买 nike

我有一个具有以下类型的变量:

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

first_custom_typesecond_custom_type 都有一个名为 func() 的函数,我想在创建 var 后执行>.

有没有办法只调用 func() 而不必检查 var 持有什么类型(例如,使用 std::get)?

最佳答案

这可以使用 std::visit 轻松完成.唯一的 cornercase 是 std::monostate,但它可以很容易地通过 overloded 辅助结构来避免(whitch 的例子在上面的链接中)

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
}

关于c++ - 调用 std::variant 持有的所有类型的成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72650739/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com