【问题标题】:Why can't we pass strings as template arguments?为什么我们不能将字符串作为模板参数传递?
【发布时间】:2013-09-20 00:32:42
【问题描述】:

我知道我们可以使用常量定义模板。例如:

template<int N>
struct FixedArray {
   double values[N];
   int size() { return N; }   // Could be static
};


int main(int, char**)  {
   FixedArray<10> arr;
   arr.values[0] = 3.14;
   cout << "first element=" << arr.values[0] << endl;
   cout << "size=" << arr.size() << endl;
   return 0;
}   

这个具体的例子让我们定义一个具有恒定大小的数组。

但是为什么我们不能在 C++ 中将字符串作为模板参数传递呢?

下面的幻灯片应该可以解释它,但我不明白问题出在哪里。

如果有人可以向我指出并解释它,我将不胜感激。 谢谢

【问题讨论】:

  • 幻灯片的哪一部分你没有得到?
  • 我已经编辑了我的问题。我希望现在更清楚了。

标签: c++ oop templates


【解决方案1】:

简短的回答是,“因为标准是这样说的”。由于模板参数用于形成 type,因此它们必须足够明确。但是,以下工作:

template <char *> struct Foo { };

char x;

int main()
{
    Foo<&x> a;
}

关键是x 现在是一个定义明确的、有链接的命名对象,所以它的地址是一个全局的、静态已知的量。从字符串文字派生的指针不具有相同的性质;它不是命名变量的地址。

【讨论】:

  • 我不完全确定我看到了整数指针和字符指针之间的区别。为什么它是否是命名变量的地址很重要?
  • @Shookie:这两种指针类型没有区别。让我对其进行编辑以减少混乱。
  • @Shookie:命名变量的地址是唯一一种允许作为非类型模板参数的指针值。它是唯一一种“足够恒定”的非线性常量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
  • 2018-01-08
  • 1970-01-01
相关资源
最近更新 更多