Barry nous a donné ce magnifique get_index
pour les variantes :
template <typename> struct tag { };
template <typename T, typename V>
struct get_index;
template <typename T, typename... Ts>
struct get_index<T, std::variant<Ts...>>
: std::integral_constant<size_t, std::variant<tag<Ts>...>(tag<T>()).index()>
{ };
A utiliser comme suit :
using V = variant<A, B, C>;
constexpr const size_t N = get_index<B, V>::value; // 1
Il fonctionne parfaitement dans Clang (OSX).
Mais dans Visual Studio 2017 Je reçois les éléments suivants :
<source>(10): error C2039: 'index': is not a member of 'std::variant<tag<Ts>...>'
<source>(10): note: see declaration of 'std::variant<tag<Ts>...>'
<source>(11): note: see reference to class template instantiation 'get_index<T,std::variant<_Types...>>' being compiled
Compiler returned: 2
Je ne vois pas pourquoi. Des idées à ce sujet ?
(Pour tout vous dire, dans mon projet, j'utilise en fait mpark::variant
parce que j'ai utilisé Xcode 9, qui n'a pas eu de std::variant
. Cependant, vous pouvez voir dans le MCVE de Godbolt ci-dessus que cela affecte la mise en œuvre avec std::variant
également. Je suis convaincu que le problème se situe soit dans le code ci-dessus, soit dans le compilateur).