2012-07-25 2 views
3

Учитывая, я могу это сделать:шаблон специализации для неспециализированных аргументов шаблона

template <class T> 
struct foo { 
    typedef T type; 
}; 

template <template <size_t> class B> 
struct foo2 { 
    typedef B<0> type; 
}; 

struct bar1 {}; 

template <size_t N = 1> 
struct bar2 {}; 

// usage 
foo<bar1>::type // ok, = bar1 
foo<bar2<> >::type // ok, = bar2<1> 
foo2<bar2>::type // ok, = bar2<0> 

Могу ли я частично специализировать Foo принять неразделенный класс аргумент BAR2? как:

foo<bar2>::type // should give me bar2<0> 

Я пытался что-то ниже, но это не работает:

// compile error 
template <template <size_t> class B> 
struct foo<B> { 
    typedef B<0> type; 
}; 
+0

'bar2' не является типом, это шаблон. Вы хотите 'bar2 <>'. И вы не можете «перегружать» шаблоны так, как вы пытаетесь. –

ответ

3

Использование decltype с перегруженной функции шаблона, я пришел с этим:

#include <type_traits> 

struct bar; 

template <size_t> struct baz; 

template <typename T> 
struct foo_type 
{ 
    typedef T type; 
}; 

template <template <size_t> class C> 
struct foo_class_template 
{ 
    typedef C<0> type; 
}; 

template <typename T> 
foo_type<T> doit(); 

template <template <size_t> class C> 
foo_class_template<C> doit(); 

void stackoverflow() 
{ 
    typedef decltype(doit<bar>()) Ret; 
    static_assert(std::is_same<Ret::type, bar>::value, "oops"); 

    typedef decltype(doit<baz>()) Ret2; 
    static_assert(std::is_same<Ret2::type, baz<0>>::value, "oops"); 
} 

Для этого вам нужна поддержка C++ 11.

Смежные вопросы