2012-11-08 18 views
5

bez specjalizujący się dla każdej klasy szablonu/klasy, jest to możliwe, aby napisać uogólniony 'ponownego powiązania' funkcja meta, tak że podaneCzy można napisać uogólniony szablon rebind?

template<class > struct foo; 
struct bar; 

następujące

is_same<rebind<foo<int>,float>,foo<float>> 
is_same<rebind<bar>,bar> 

a może

is_same< rebind<std::vector<int>,float>,std::vector<float>> 

zwraca odpowiednik typu true?

Odpowiedz

6

Pewnie.

Należy jednak pamiętać, że dowolny parametr szablonu szablonu przyjmujący listę parametrów variadic jest ograniczony do akceptowania szablonów zawierających tylko parametry typu, a nie parametry nietypowe. Innymi słowy, poniższy ogólny przypadek nie zadziała dla std::array, ponieważ jego drugi argument jest liczbą całkowitą. Musisz dodać specjalny przypadek.

Główny szablon jest już specjalnym przypadkiem, ponieważ obsługuje klasy, które nie są specjalizacją szablonu.

http://liveworkspace.org/code/5b6f0cb3aec1eb74701e73d8d21aebab

template< typename bound, typename ... new_args > 
struct rebind_class { 
    static_assert(sizeof ...(new_args) == 0, 
     "can't rebind arguments to non-specialization"); 
    typedef bound type; 
}; 

template< template< typename ... > class template_, typename ... new_args, 
    typename ... old_args > 
struct rebind_class< template_< old_args ... >, new_args ... > { 
    typedef template_< new_args ... > type; 
}; 

template< typename ... args > 
using rebind = typename rebind_class< args ... >::type; 
+0

Sir, sir. To jest wspaniałe! –

+1

Ah ... Bez silnej motywacji, to wygląda jak hack. Proszę nie używać tego rodzaju rzeczy, z wyjątkiem może do obejścia niechętnego do współpracy interfejsu do pewnej biblioteki. – Potatoswatter

+0

dokładnie to, czego szukałem! dziękując Tobie. Mam kilka iteratorów, które przyjmują typ sekwencji jako pierwszy argument i tworzą iterator const, jeśli argument jest określony jako const. zadaniem było uzyskanie iteratora const z mutable i vice versa. w ten sposób zmodyfikował kod niewiele, aby nawet mpl jak symbol zastępczy, taki jak rebind , zastosuj > czyni foo . Argumenty wartości nie są dla mnie problemem, ponieważ zawsze preferuję taką tablicę jak > over std :: array – abir

Powiązane problemy