My main idea was to get my own class from std :: tuple, to get some helper types inside:
template <typename ... T> class TypeContainer: public std::tuple<T...> { public: using BaseType = std::tuple<T...>; static const size_t Size = sizeof...(T); TypeContainer(T... args):std::tuple<T...>(args...){}; using index_sequence = std::index_sequence_for<T...>; };
Now I am trying to use the code as follows:
using MyType_tuple_with_empty = std::tuple< std::tuple<float,int>, std::tuple<>, std::tuple<int>>; using MyType_typecontainer_with_empty = TypeContainer< TypeContainer<float,int>, TypeContainer<>, TypeContainer<int>>; using MyType_tuple_non_empty = std::tuple< std::tuple<float,int>, std::tuple<int>, std::tuple<int>>; using MyType_typecontainer_non_empty = TypeContainer< TypeContainer<float,int>, TypeContainer<int>, TypeContainer<int>>; template <typename T> void Do( const T& parms ) {
If I compiled with Do(p2) , I get the following error:
error: there is no corresponding function to call get(const TypeContainer<TypeContainer<float, int>, TypeContainer<>, TypeContainer<int> >&)
Can someone explain why the existence of an empty TypeContainer in connection with std::get will lead to this problem?
Edit: Additional information:
Lines
MyType_tuple_with_empty p1{{{ 1.2,3},{},{1}}}; MyType_tuple_non_empty p3{{ 1.2,3},{4},{1}};
cannot compile with gcc5.2.0, but with gcc6.1.0. This is a little cryptic because I remember that the tuple constructor is really explicit. Why does this work with gcc6.1.0? But this is not the problem I'm looking for :-)
Another hint: The code I'm having problems with seems to be compiling with clang3.5.0.
A little hard to understand ...
Edit2: Digging through the error lists (long :-)) I found:
/opt/linux-gnu_5.2.0/include/++/5.2.0/tuple | 832 col 5 | note: template argument failed / replacement: main.cpp | 104 col 45 | note: ' std::tuple<_Elements ...> ' is the ambiguous base class ' TypeContainer<TypeContainer<float, int>, TypeContainer<>, TypeContainer<int> > ' || std::cout << std::get<0>(std::get<0>(parms)) << " " ;
It seems that in libg ++, someone is outputting multiple times from any type of tuple, which seems to be a broken library. Searching for this topic leads me to: Error of empty nested tuples
Is it really connected? Same error or new :-)