C++模板模板参数

san*_*ark 5 c++ templates

#include <iostream>

using namespace std;

template <typename T = int>
struct Foo {
    T t;
    Foo() { cout << "Foo" << endl; }
};

template <typename T>
struct Baz {
    T t;
    Baz() { cout << "Baz" << endl; }
};

template <typename T>
struct Bar {
    T t;
    Bar() { cout << "Bar" << endl; }
};

template <template <typename X> class T>
struct Bar {
    T data;
    Bar() : data() { cout << "Bar" << endl; }
};

int main()
{
    Bar<Foo<>> a;

    Bar<Baz<float>> b;

    Bar<int> c;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我刚刚开始学习模板。而且我真的对模板模板参数感到困惑。我知道您正在传递一个模板作为参数。在我的 Bar 模板类中,它接收模板模板参数,<typename X>代表什么?是typename X模板参数吗class T

template <template <typename X> class T>
struct Bar {
    T data;
    Bar() : data() { cout << "Bar" << endl; }
};
Run Code Online (Sandbox Code Playgroud)

另外,当我在主函数中调用模板模板参数时,我收到错误,指出 Bar 没有默认构造函数。这是为什么?

sti*_*ate 3

typename X只是模板模板参数签名的一部分,你也可以直接写template<template<typename> class T>(没有T参数的名称)。

由于T它本身是一个模板,因此您需要先实例化它,然后才能将其用作类。签名告诉您模板需要实例化什么,在本例中,它需要一个类型名称。

template<typename X>
struct GenericThing
{
    X data;
};

template<template<typename> class T, typename E>
struct Bar
{
    T<E> sub; // instantiate T with E
    Bar() : sub() { cout << "Bar" << endl; }
};

int main()
{
    Bar<GenericThing, int> intbar;
    Bar<GenericThing, float> floatbar;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)