我在使用gcc中here中所述的变体访问过载技巧时遇到了麻烦。我在编译器资源管理器上尝试了不同的版本,但没有一个起作用。另一方面,最新的clang版本接受它。
template <class... Fs>
struct overload : Fs...
{
template <class... Ts>
overload(Ts&& ...ts) : Fs{std::forward<Ts>(ts)}... {}
using Fs::operator()...;
};
template <class... Ts>
overload(Ts&&...) -> overload<std::remove_reference_t<Ts>...>;
int main()
{
auto visitor = overload(
[](int) { },
[](double) { }
);
}
给予
<source>: In instantiation of 'overload<Fs>::overload(Ts&& ...) [with Ts = {func()::<lambda(int)>, func()::<lambda(double)>}; Fs = {}]':
<source>:21:13: required from here
<source>:7:52: error: mismatched argument pack lengths while expanding 'Fs'
overload(Ts&& ...ts) : Fs{std::forward<Ts>(ts)}...
^~~
Compiler returned: 1
gcc似乎在模板推导指南上遇到了麻烦。
编辑:我发现用这样的功能模板代替了演绎指南
template <class... Ts>
overload<std::remove_reference_t<Ts>...> overloaded(Ts&& ...ts)
{
return overload<std::remove_reference_t<Ts>...>(ts...);
}
可行,但是如果推导指南有问题还是gcc错误,我会感兴趣吗?