【发布时间】:2021-02-04 14:29:09
【问题描述】:
我有以下代码,它使用 lambda 扩展了 overload 技巧以接受变体。但是,变体不是示例中的问题。
#include <memory>
#include <variant>
#include <functional>
template <class ...Fs>
struct overload : Fs... {
template <class ...Ts>
overload(Ts&& ...ts) : Fs{std::forward<Ts>(ts)}...
{}
using Fs::operator()...;
template <class ...Vs>
auto operator()(std::variant<Vs...>&&arg){
return std::visit(*this,std::forward<decltype(arg)>(arg));
}
};
template <typename ...Ts>
overload(Ts&&...) -> overload<std::remove_reference_t<Ts>...>;
using Foo = std::variant<int, char*, double,long>;
int main()
{
auto fn = overload(
[](int x){ return 0;}
,[](char * x) {return 1;}
,[](double x){ return 2;}
,[](long x){ return 3;}
);
std::function<int(Foo)> fn2 = overload(
[&](auto x){return fn(x);}
);
//auto ff = fn;
//std::function<int(Foo)> fn3 = fn;
auto a = fn2(10);
auto b = fn2((char *)"10");
auto c = fn2(10.);
auto d = fn(10);
auto e = fn((char *)"10");
auto f = fn(10.);
return a+b+c+d+e+f;
}
效果很好。但是如果我取消注释该行
auto ff=fn;
然后代码失败,因为overload 的默认复制构造函数不起作用。可以写一个吗?
【问题讨论】:
标签: c++ lambda c++17 overloading