【问题标题】:templates <int T> C++ [duplicate]模板 <int T> C++ [重复]
【发布时间】:2014-07-16 20:40:53
【问题描述】:

template &lt;int N&gt;定义模板是什么意思,我是从书中的一个例子中读到的:

typedef map<int, double> row;
template <int N> struct matrix;
{
   map <int, row> my_matrix;
}

我经常看到模板后面跟着类然后输入,即template &lt;class int&gt;

【问题讨论】:

  • template&lt;class int&gt; 无效。

标签: c++ templates


【解决方案1】:

模板参数可以是三种 C++ 实体中的任何一种:值、类型或模板:

template <int N> struct Foo;                        // N is a value

template <typename T> struct Bar;                   // T is a type

template <template <typename> class X> struct Zip;  // X is a template

示例用法:

Foo<10> a;

Bar<int> b;

Zip<Bar> c;

请注意,这对应于消除依赖名称的三种方式:

X::a = 10;              // X::a is a value
typename X::B n = 10;   // X::B is a type
X::template C<int> m;   // X::C is a template

当您想“典型化”一个值时,会出现一个有趣的组合。可以这样做:

template <typename T, T Val> struct Typificate;

现在你可以说例如Typificate&lt;int, 10&gt; 获取表示整数 10 的唯一类型。这有时会非常有用,例如当T 是成员函数指针时(例如在this delegate implementation 中);或者它可以用于为标签调度等创建值唯一的重载。

【讨论】:

  • 我对这个例子还是有点困惑,假设我们有template &lt;class name, class type&gt; class row { private: name some_name; type some_type; }; class name/type 用于代表类中定义的变量,但是,拥有template &lt;int N&gt; struct Foo; 的目的是什么"N" 是干什么用的?
  • @JamesHallen:它可以用于任何你想要的东西。一个明显的例子是一些自定义数组模板中的数组大小。
  • 所以在这种情况下,我们不使用“N”来表示结构中的任何变量,而是使用它来初始化数组。例如:vector&lt;int&gt; my_vector(2);,使用“N”类似于构造大小为 2 的向量
  • @JamesHallen:考虑template &lt;unsigned int N&gt; struct Foo { int a[N]; };
  • 对不起,我上面代码中的另一个问题:如果我声明matrix&lt;5&gt; temp;,会创建my_matrix的5个元素,换句话说我可以访问temp.my_matrix[0]temp.my_matrix[1].. .temp.my_matrix[4]?
【解决方案2】:

这是一个非类型模板参数。模板参数列表中的参数可以是非类型参数、类型参数或模板参数。在您的示例中,它是第一个。如需更多信息,请参阅Template parameters and template arguments

非类型模板参数通常用于初始化类或指定类成员的大小。根据标准(14.1 [temp.param]),非类型模板参数可以具有以下类型之一:

非类型模板参数应具有以下之一 (可选 cv 限定)类型:

  • 整数或枚举类型,
  • 指向对象的指针或指向函数的指针,
  • 对对象的左值引用或对函数的左值引用,
  • 指向成员的指针,
  • std::nullptr_t.

【讨论】:

    【解决方案3】:

    它将提供一个在编译时评估的int 常量值

    template <int N> struct matrix {
       static const int MatrixSize = N;
       map <int, row> my_matrix;
    };
    
    matrix<10>::MatrixSize; // Yields 10
    

    【讨论】:

    • typedef 用于定义静态整数值?
    • @delnan 感谢您的指出。当然不是typedef :P ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 2019-07-30
    • 2012-10-13
    • 2014-10-14
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多