gpt4 book ai didi

c++ - 带有重载 lambda 的 std::variant,用 MSVC 替代?

转载 作者:太空狗 更新时间:2023-10-29 22:55:44 26 4
gpt4 key购买 nike

cppreference 重载“技巧”可以通过模板化的 operator() 重载访问每个变体,但不能使用 Visual C++ 编译器进行编译。可以找到代码片段here并在使用 clang 或 gcc 编译时执行良好。

但是,这不能用 MSVC ( see on godbolt ) 编译:

template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<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

有替代方案吗?我是否缺少编译器选项?

最佳答案

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)...}; }

或升级到最新的编译器。

关于c++ - 带有重载 lambda 的 std::variant,用 MSVC 替代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50510122/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com