Bearbeiten Append: Der Titel der Frage war "haben Visual Studio Compiler oder Clang haben falsches Verhalten" - aber das wurde geändert.Benötigt der Standard std :: tuple_size, um SFINAE-freundlich zu sein?
Also füge ich hier, dass clang und gcc kompiliert es so, wie ich es vorhatte, aber VS nicht.
Ich habe den folgenden Code:
template<typename S, typename T, std::size_t... I>
void
print_tuple_like(S& s, const T& t, std::index_sequence<I...>)
{
void* unused[] = { &(s << std::get<I>(t))... };
}
template<typename S, typename T,
std::size_t N = std::tuple_size<decltype(T::children)>::value>
S& operator<<(S& s, const T& t)
{
print_tuple_like(s, t.children, std::make_index_sequence<N>{});
return s;
}
und ich bekomme einen Compiler-Fehler:
1>c:\program files (x86)\microsoft visual studio 14.0\vc\include\utility(313): error C2338: The C++ Standard doesn't define tuple_size for this type.
1> c:\users\jonas\documents\visual studio 2015\projects\consoleapplication7\consoleapplication7\consoleapplication7.cpp(36): note: see reference to class template instantiation 'std::tuple_size<unknown-type>' being compiled
1> c:\users\jonas\documents\visual studio 2015\projects\consoleapplication7\consoleapplication7\consoleapplication7.cpp(43): note: see reference to function template instantiation 'void print_tuple_like<S,std::tuple<Signature::A,Signature::B>,0,1>(S &,const T &,std::integer_sequence<_Ty,0,1>)' being compiled
1> with
1> [
1> S=std::ostream,
1> T=std::tuple<Signature::A,Signature::B>,
1> _Ty=size_t
1> ]
1> c:\users\jonas\documents\visual studio 2015\projects\consoleapplication7\consoleapplication7\consoleapplication7.cpp(50): note: see reference to function template instantiation 'S &operator <<<std::ostream,Signature,2>(S &,const T &)' being compiled
1> with
1> [
1> S=std::ostream,
1> T=Signature
1> ]
Das liegt daran, dass der folgende Code in Visual Studio:
// TEMPLATE STRUCT tuple_size
template<class _Tuple>
struct tuple_size { // size of non-tuple
static_assert(_Always_false<_Tuple>::value, "The C++ Standard doesn't define tuple_size for this type.");
};
das machen Substitutionsfehler in einen harten Fehler - die SFINAE SFIAE
machenWenn ich
static_assert(_Always_false<_Tuple>::value, "The C++ Standard doesn't define tuple_size for this type.");
es funktioniert entfernen.
Ist der Code die C++ - Standardregeln? Oder ist Microsoft falsch?
Das ist ein ziemlich intensiver Code dort. Was versuchst du zu erreichen? – tadman
Wenn ich eine Klasse mit einem Mitglied namens childs habe, das ein Tupel ist, sollte das Tupel iteriert werden und die Kinder << streamed –
Alle Vorschläge für einen alternativen Ansatz ist auch willkommen :) –