language: C++11 (gcc-4.7.2)
date: 425 days 22 hours ago
link:
visibility: public
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <cstdlib>
#include <tuple>
 
template<typename X> struct Y {};
 
template<typename T, size_t Level, size_t TermLevel> struct A;
 
template<typename ... Ts>
struct A<std::tuple<Y<Ts>...>, 1, 1> {};
 
// (B) dummy for T=tuple<int, Ts...> just to show it works for simple expansions
template<typename ... Ts, size_t Level, size_t TermLevel>
struct A<std::tuple<int, Ts...>, Level, TermLevel>
{
    A<std::tuple<int, Ts...>, Level+1, TermLevel> value;
};
 
template<typename ... Ts, size_t Level>
struct A<std::tuple<int, Ts...>, Level, Level> {};
 
 
// (C) ambiguous partial specialization
template<typename T1, typename T2, size_t Level, size_t TermLevel>
struct A<std::tuple<Y<T1>, Y<T2> >, Level, TermLevel>
{
    A<std::tuple<Y<T1>, Y<T2>>, Level+1, TermLevel> value;
};
 
template<typename T1, typename T2, size_t Level>
struct A<std::tuple<Y<T1>, Y<T2>>, Level, Level> {};
 
int main(int argc, const char *argv[])
{
    A<std::tuple<int, Y<int>, Y<float>>, 0, 5> tint;
    A<std::tuple<Y<int>, Y<float>>, 0, 5> tn;
    return 0;
}