有没有办法使用“任意”变体作为参数?

Posted

技术标签:

【中文标题】有没有办法使用“任意”变体作为参数?【英文标题】:Is there a way to use an "arbitrary" variant as a parameter? 【发布时间】:2021-09-22 02:35:48 【问题描述】:

想象一下,我有一些针对许多不同类型重载的函数。

void func(int value) ... 
void func(double value) ... 
void func(bool value) ... 

有没有办法为重载类型的 任意 组合的 std::variant 定义它?例如

template<class... Ts> struct overload : Ts...  using Ts::operator()...; ;
template<class... Ts> overload(Ts...) -> overload<Ts...>;

void func(std::variant<> variant)

  std::visit(overload[](auto& value)  func(value); , variant);

这样我就不必为每个可能的模板编写单独的重载,即在以下示例中

std::variant<int, double> v1;
std::variant<double, bool> v2;
std::variant<int, double, bool> v3;

func(v1);
func(v2);
func(v3);

所有三个调用都将使用 func() 的单个“任意变体”重载。

请注意,除了我列出的三种基本类型之外,还可能涉及更多类型。

编辑:增加了额外的清晰度。

【问题讨论】:

你试过template&lt;class... Ts&gt; void func(std::variant&lt;Ts...&gt; variant)吗? 显然是的。输入std::variant&lt;int,double,bool&gt;。但我怀疑你的实际问题不是那个。请澄清。 FWIW,如果你已经有一组重载,你可以跳过 overload 结构和它的推导指南完全使用 BOOST_HOF_LIFT 这种方式:auto overloeaded_func = BOOST_HOF_LIFT(func);。另外,如果你真的需要overload函数,你可以避免自己写,而依赖boost::hana::overload 【参考方案1】:

使用可变参数模板,您可以这样做:

template <typename... Ts>
void func(const std::variant<Ts...>& variant)

    std::visit([](auto& value)  func(value); , variant);

Demo

【讨论】:

以上是关于有没有办法使用“任意”变体作为参数?的主要内容,如果未能解决你的问题,请参考以下文章

从任何函数中提取函数参数和默认值

有没有办法使用 javascript/Jquery 将未提交的输入字段的值属性作为 URL 的参数传递?

将多个变体组合成一个变体

有没有办法在 C++ 中将 auto 作为参数传递?

有没有办法在 Alamofire 中将数据作为对象而不是参数发送?

C++17,制作一个使用依赖于模板参数的 std::variant 的可变参数模板?