为啥我们不能将字符串作为模板参数传递?

Posted

技术标签:

【中文标题】为啥我们不能将字符串作为模板参数传递?【英文标题】: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++ 中将字符串作为模板参数传递呢?

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

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

【问题讨论】:

幻灯片的哪一部分你没有得到? 我已经编辑了我的问题。我希望现在更清楚了。 【参考方案1】:

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

template <char *> struct Foo  ;

char x;

int main()

    Foo<&x> a;

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

【讨论】:

我不完全确定我看到了整数指针和字符指针之间的区别。为什么它是否是命名变量的地址很重要? @Shookie:这两种指针类型没有区别。让我对其进行编辑以减少混乱。 @Shookie:命名变量的地址是唯一一种允许作为非类型模板参数的指针值。它是唯一一种“足够恒定”的非线性常量。

以上是关于为啥我们不能将字符串作为模板参数传递?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能将函数指针作为模板参数传递给地图?

为啥我们将字符串数组作为参数传递给 main() 方法,为啥不传递任何集合类型或包装类型或原始类型?

为啥数组不能作为函数参数传递?

为啥我不能将常量数组作为参数传递?

为啥不能将运算符作为参数传递? [关闭]

为啥关键字参数必须作为带有符号键的哈希传递,而不是 Ruby 中的字符串键?