2016-05-22 14 views
6

Chcę, aby parametr szablonu akceptował szablon z argumentem szablonu numerycznego.Jak ustawić parametr szablonu szablonu na wartość liczbową?

Ten przykład może nadmiernie uproszczone, ale chciałbym coś takiego:

template <int X> 
struct XX 
{ 
    static const int x = X; 
}; 

template<typename TT, TT V, template<V> TX> 
void fnx(TX<V> x) 
{ 
    static_assert(V == TX::x, "IMPOSSIBLE!"); 
} 

void fny() 
{ 
    fnx(XX<1>()) 
} 

Nie należy zrozumieć składnię dla tego, co musi być możliwe. Jak to osiągnąć?

+2

co się 'TT' ma być? w jaki sposób kompilator wywnioskuje jego typ podczas wywoływania 'fnx' w' fny'? czy możesz podać więcej kontekstu swojego problemu, który próbujesz rozwiązać za pomocą tego podejścia? –

+0

@ m.s. 'int', przypuszczalnie. – Barry

+0

Syntaktycznie potrzebujesz 'template class TX'. Ale to nie jest cały problem. –

Odpowiedz

6

Wystarczy ustalenie zapasową składnię nieco - ponieważ parametr szablonu szablon jest niewłaściwie określony, chcemy skończyć z czymś takim:

template <typename T, template <T > class Z, T Value> 
//     ^^^^^^^^^^^^^^^^^^^^^ 
void foo(Z<Value> x) { } 

Jednak kompilator nie może wywnioskować T tutaj - to nie wywnioskowany kontekst. Musisz to wyraźnie podać:

foo<int>(XX<1>{}); 

To dość denerwujące. Nie mogę nawet napisać cechy typu takiej, że non_type_t<XX<1>> jest(gdzie ta cecha faktycznie wykonuje introspekcję na typie, a nie coś, co trywialnie zwraca int).


Jest propozycja, aby poprawić ten proces (P0127) poprzez zmianę non-wywnioskować kontekstowe-ności non typu argumentów szablonu.

+0

Brzmi jak propozycja "szablonu ", do głosowania w Oulu. – chris

+0

@chris Tak, znalazłem. – Barry

+0

Ah, tak. Typ parametru jest typem, a nie wartością. Dzięki. Szkoda tylko z powodu niepowodzenia automatycznego odliczenia. :( – Adrian

2

Twoja deklaracja fnx wymaga trochę pracy, a typ TT nie może zostać wyprowadzony na stronie połączenia.

template<typename TT, TT V, template<TT> class TX> 
void fnx(TX<V> x) 
{ 
    static_assert(V == TX<V>::x, "IMPOSSIBLE!"); 
} 

void fny() 
{ 
    fnx<int>(XX<1>()); 
} 

przykład robocza: https://ideone.com/57PsCA

Powiązane problemy