![](/img/trans.png)
[英]How to define class with overloaded methods for each std::variant alternative?
[英]std::variant with overloaded lambdas, alternative with MSVC?
cppreference重載“技巧”,其中每個變體可以通過模板化的operator()
重載訪問,不能使用Visual C ++編譯器進行編譯。 可以在此處找到代碼段,並在使用clang或gcc編譯時執行正常。
但是,這不能用MSVC編譯( 參見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)...}; }
或升級到最新的編譯器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.