有没有办法使用“任意”变体作为参数?
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<class... Ts> void func(std::variant<Ts...> variant)
吗?
显然是的。输入std::variant<int,double,bool>
。但我怀疑你的实际问题不是那个。请澄清。
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 的参数传递?