我知道模板是一个编译时构造,但我现在问自己的是:假设我有以下功能
void caller1() {
function(1);
}
void caller2() {
function(2);
}
void caller3() {
function(3);
}
void function(int dimensions) {
if(dimensions <= 0 || dimensions > 3)
throw out_of_range("Wrong dims");
}
该检查在运行时并不是一个很大的延迟,但我想知道我是否可以用带有&#34; int维度的模板化函数替换该函数&#34;模板的参数:我的问题是,是否可以在编译时解决并为调用者中调用的所有三个函数生成代码
答案 0 :(得分:7)
如果表达式不是评估的编译时间,则它不能是模板参数。
可以修改您的构造以执行编译时评估,但这不会导致运行时错误(异常),但会出现编译错误:
template<int N>
typename std::enable_if<(N>0 && N<=3)>::type function() {
// stuff
}
但是这需要在编译时知道维度N
,以便您可以像这样调用函数:
function<2>(); // OK
function<5>(); // compilation error
答案 1 :(得分:2)
只要在编译时始终知道dimensions
参数,那就可行。有关使用模板的一些说明,请参阅http://eli.thegreenplace.net/2011/04/22/c-template-syntax-patterns/,而不是通常的#34;使此容器变得灵活&#34;。