2014-11-24 2 views
2

Я хочу Base шаблон класс с двумя параметрами шаблона. В частности, вторым параметром является параметр шаблона. Derived получен из Base с CRTP. Теперь я хочу сгенерировать базовый класс Derived как Base<Derived,Derived::second_tmpl>, но базовый класс генерации не такой же, как у базового базового класса Derived. Как передать шаблон?Как передать шаблон?

#include <type_traits> 

template<typename T, template<typename>class U> 
struct Base 
{ 
    using type = Base<T,U>; 
    using devired_type = T; 
    template<typename V> 
    using second_tmpl = U<V>; 
    using second_type = second_tmpl<type>; 
}; 

template<typename T> 
struct Template 
{ 
    using type = Template<T>; 
}; 

struct Derived 
    :public Base<Derived,Template> 
{ 
}; 

//true 
static_assert(
     std::is_same< 
      Derived::second_type, 
      Template<Base<Derived,Template>>>::value, 
     "false"); 
//false 
static_assert(
     std::is_base_of< 
      Base<Derived,Derived::second_tmpl>, 
      Derived 
     >::value, 
     "false"); 

template<typename T> 
using Template2 = Template<T>; 
//false 
static_assert(
     std::is_same< 
      Base<Derived,Template>, 
      Base<Derived,Template2> 
     >::value, 
     "false"); 

Используйте шаблон, который совпадает с исходным шаблоном вместо исходного шаблона. Суждение ложно;

ответ

2

Это ограничения аргументов шаблона tempalte.

аргументы шаблона Шаблон являются гражданами второго класса в C++ :(

Второй утверждают, должны действительно прочитать

static_assert(std::is_base_of<Base<Derived, Template>, Derived>::value, "false"); 

, которая будет работать.

Для бороться с проблемой с третьим (тот факт, что вы «не можете» pedef a открыть шаблон "), сделать его мета-функцией: например. с TemplateGen в следующей программе:

Live On Coliru

#include <type_traits> 

template <typename T, typename UGen> 
struct Base { 
    using type = Base<T, typename UGen::template type<T> >; 
    using devired_type = T; 

    template <typename V> using second_tmpl = typename UGen::template type<T> ; 
    using second_type = second_tmpl<type>; 
}; 

template <typename T> 
struct Template { 
    using type = Template<T>; 
}; 

struct TemplateGen { 
    template <typename T> using type = Template<T>; 
}; 

struct Derived : public Base<Derived, TemplateGen> { 
}; 

// true 
static_assert(std::is_same<Derived::second_type, Template<Derived> >::value, "false"); 
// false 
static_assert(std::is_base_of<Base<Derived, TemplateGen>, Derived>::value, "false"); 

using Template2 = TemplateGen; 

// false 
static_assert(std::is_same<Base<Derived, TemplateGen>, Base<Derived, Template2>>::value, "false"); 

int main(){} 
Смежные вопросы