C++ std::带有重载lambda的变体,MSVC的替代品?
C++偏好重载“技巧”,其中每个变量可以通过模板化的代码>操作器()来访问。使用clang或gcc编译时,可以找到代码片段并执行良好 但是,这不是使用MSVC()编译的:C++ std::带有重载lambda的变体,MSVC的替代品?,c++,visual-c++,c++17,C++,Visual C++,C++17,C++偏好重载“技巧”,其中每个变量可以通过模板化的代码>操作器()来访问。使用clang或gcc编译时,可以找到代码片段并执行良好 但是,这不是使用MSVC()编译的: 模板结构重载:Ts。。。{使用Ts::运算符()…;}; 模板重载(Ts…)->重载; 它抛出各种错误并最终失败: warning C4346: 'Ts::()': dependent name is not a type note: prefix with 'typename' to indicate a type
模板结构重载:Ts。。。{使用Ts::运算符()…;};
模板重载(Ts…)->重载;
它抛出各种错误并最终失败:
warning C4346: 'Ts::()': dependent name is not a type
note: prefix with 'typename' to indicate a type
note: see reference to class template instantiation 'overloaded<Ts...>' being compiled
error C2143: syntax error: missing ';' before '...'
error C2059: syntax error: '...'
error C2238: unexpected token(s) preceding ';'
error C2988: unrecognizable template declaration/definition
error C2143: syntax error: missing ')' before '...'
error C2143: syntax error: missing ';' before '...'
error C2365: 'Ts': redefinition; previous definition was 'template parameter'
note: see declaration of 'Ts'
error C2059: syntax error: ')'
error C2059: syntax error: '->'
error C2065: 'Ts': undeclared identifier
error C3544: 'Ts': parameter pack expects a type template argument
警告C4346:'Ts::()':依赖名称不是类型
注:前缀为“typename”表示类型
注意:请参阅正在编译的类模板实例化“重载”
错误C2143:语法错误:缺少“;”在“…”之前
错误C2059:语法错误:“…”
错误C2238:在“;”之前出现意外标记
错误C2988:无法识别的模板声明/定义
错误C2143:语法错误:在“…”之前缺少“)”
错误C2143:语法错误:缺少“;”在“…”之前
错误C2365:“Ts”:重新定义;以前的定义是“模板参数”
注:见“Ts”声明
错误C2059:语法错误:')'
错误C2059:语法错误:'->'
错误C2065:“Ts”:未声明的标识符
错误C3544:“Ts”:参数包需要类型模板参数
还有别的选择吗?是否缺少编译器的选项?模板
template<class...Ts>
struct overloaded_t {};
template<class T0>
struct overloaded_t<T0>:T0 {
using T0::operator();
overloaded_t(T0 t0):T0(std::move(t0)) {}
};
template<class T0, class T1, class...Ts>
struct overloaded_t<T0, T1, Ts...>:T0, overloaded_t<T1, Ts...> {
using T0::operator();
using overloaded_t<T1, Ts...>::operator();
overloaded_t(T0 t0, T1 t1, Ts... ts):
T0(std::move(t0)),
overloaded_t<T1, Ts...>(std::move(t1), std::move(ts)...)
{}
};
template<class...Ts>
overloaded_t<Ts...> overloaded(Ts...ts){ return {std::move(ts)...}; }
结构重载_t{};
模板
结构重载\u t:T0{
使用T0::operator();
重载_t(T0-T0):T0(std::move(T0)){
};
模板
结构重载\u t:T0,重载\u t{
使用T0::operator();
使用重载的_t::operator();
过载(T0 T0,T1 T1,Ts…Ts):
T0(标准::移动(T0)),
重载(std::move(t1),std::move(ts)…)
{}
};
模板
重载\u t重载(Ts…Ts){return{std::move(Ts)…};}
或者升级到最新的编译器。@Someprogrammerdude但这是一个伪错误——MSVC似乎认为这是到
()
的转换运算符,这确实不是一个很好的类型。这对我来说在15.7.1G版本上编译很好。Godbolt使用的是编译器版本19.10.25017,我的15.7.1版本有编译器版本19.14.26428.1Ha。。好的,这是一个编译器版本的问题,它确实适用于最新版本。我看看能不能更新这台机器。与此同时,它仍然强调语法是错误的。
template<class...Ts>
struct overloaded_t {};
template<class T0>
struct overloaded_t<T0>:T0 {
using T0::operator();
overloaded_t(T0 t0):T0(std::move(t0)) {}
};
template<class T0, class T1, class...Ts>
struct overloaded_t<T0, T1, Ts...>:T0, overloaded_t<T1, Ts...> {
using T0::operator();
using overloaded_t<T1, Ts...>::operator();
overloaded_t(T0 t0, T1 t1, Ts... ts):
T0(std::move(t0)),
overloaded_t<T1, Ts...>(std::move(t1), std::move(ts)...)
{}
};
template<class...Ts>
overloaded_t<Ts...> overloaded(Ts...ts){ return {std::move(ts)...}; }