我想要一个带有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");
使用与原始模板相同的模板而不是原始模板。判断是错误的;
答案 0 :(得分:2)
这些是tempalte模板参数的限制。
模板模板参数是C ++中的二等公民 :(
第二个断言应该真正阅读
static_assert(std::is_base_of<Base<Derived, Template>, Derived>::value, "false");
哪个会奏效。
要解决第三个问题(事实上你无法输入打开的模板&#34;),请将其设为元功能:例如:在以下程序中使用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(){}