2014-11-24 57 views
2

我想要一個帶有2個模板參數的Base模板類。特別的,第二個參數是一個模板參數。 Derived源自帶有CRTP的Base。現在我想生成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"); 

這是可行的。

要與第三個戰鬥的問題(你不能ty的事實pedef an open template「),使其成爲元函數:例如,與在下面的程序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(){}