c++ - 如何传输模板?

标签 c++ templates template-templates

我想要一个Base具有 2 个模板参数的模板类。特别地,第二个参数是模板参数。 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");

使用与原始模板相同的模板来代替原始模板。判断错误;

最佳答案

这些是 tempalte 模板参数的限制。

Template template arguments are second-class citizens in C++ :(

第二个断言应该真正读取

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

这会起作用。

要解决第三个问题(事实上,您“无法输入定义打开模板”),请将其设为元函数:例如在下面的程序中使用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(){}

关于c++ - 如何传输模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27108614/

相关文章:

c++ - Mac OS X/Linux 上的 _vscwprintf

c++ - 为什么模板只能在头文件中实现?

C++:模板 模板参数的模板成员作为模板类的参数 需要模板 模板参数

c++ - 子类作为模板基类的模板模板参数,而模板基类又是子类函数参数

c++ - QT : How to determine if the event processor is busy

c++ - 模板构造函数类型推导对于 function<> 参数不起作用(没有匹配的构造函数用于初始化...)

c++ - 不同编译器中的纯/常量函数属性

c++ - 模板函数中 STL 容器的默认参数

javascript - 如何使完整的 DIV 可通过 anchor 单击...但在该 DIV 中,有一个不跟随该 anchor 的输入按钮?

c++ - 模板模板参数简单示例