【发布时间】:2013-07-21 06:28:07
【问题描述】:
我需要使用与模板参数相同类型的元素列表,所以我使用的是向量,但我不知道如何进行这项工作
#include <iostream>
#include <cstdint>
#include <vector>
template <uint8_t VAL>
void foo()
{
std::cout << "__" << std::endl;
};
template <>
void foo<3>()
{
std::cout << "OK" << std::endl;
};
int main()
{
std::vector<uint8_t> v = { 2, 4, 5, 2, 3, 55 };
for (auto &k : v) {
foo<k>();
}
return (0);
}
编译器基本上抱怨k不是a constant expression,问题是我不知道如何修改它以使其工作,我需要一些数据结构来迭代,所以我需要保留矢量,我需要一个模板来简化我的生活,所以我越看这个越觉得自己陷入了无限循环。
【问题讨论】:
-
不,这不是模板的用例。这是
if (i == 3) cout << "OK";的用例。 -
@H2CO3 你到底是什么意思?您可以模板化一个数值,这是肯定的,
<3>的重载只是为了检查模板调用中的某些内容。我需要一个数值模板。 -
@userXXX 我知道你可以使用 integer(不是任何数字)作为模板参数。虽然不是变量,但只是一个编译时常量。我的意思是我没有看到模板的必要性。这很可能是一个 XY 问题。
-
模板必须在编译时解析。这意味着您用作模板参数的任何内容都必须是编译时常量。这不仅意味着该值是在编译时设置的,而且它在语法上用作常量,而不仅仅是普通变量的值(就像您在此处所做的那样)。
-
@JerryCoffin 是的,事实上我的问题是如何将该向量转换为恒定编译时间的值集,真正的问题与模板无关。