为啥我们不能将字符串作为模板参数传递?
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:命名变量的地址是唯一一种允许作为非类型模板参数的指针值。它是唯一一种“足够恒定”的非线性常量。以上是关于为啥我们不能将字符串作为模板参数传递?的主要内容,如果未能解决你的问题,请参考以下文章