假设我有以下形式的模板函数:
template<bool a, bool b, bool c>
void foo(){
if(a) printf("I do something when a is true!\n");
if(b) printf("I do something when b is true!\n");
if(c) printf("I do something when c is true!\n");
}
现在我有一个函数,可以在编译时为8个可能的情况(a = b = c = true、a=b=true c=false等)进行特化。
我想用运行时获取的a、b和c的值来调用这个函数。
如果模板只有一个参数,我可以这样做:
void caller(bool a){
if(a) foo<true>();
else foo<false>();
}
但是如果您有两个或更多参数呢?您不能只这样做:
void caller(bool a, bool b, bool c){
foo<a,b,c>();
}
如果您使用if-else/switch进行编程,那么可能会出现繁琐的代码和混乱的情况。我希望编译器可以编译8个版本的foo并直接调用。
foo<a,b,c>()
如果我不是布尔类型而是其他类型,情况也可以等价地被处理:
template<int a>
void foo(){
printf("%d", a);
}
假设我知道a的取值范围在0到32之间。
我想要这样做:
void caller(int a){
if(a<=32 && a>0) foo<a>();
else printf("ERROR!/n");
}
如何处理这种情况最好的方式是什么?
if
分支变成自己的基于布尔类型的模板函数,然后从三个模板参数函数的编译时和运行时版本中调用它们吗?我猜你实现的各种函数并不是constexpr
的... - jaggedSpirefoo<a,b,c>()
正常工作,必须在编译时知道a、b、c的值。 - Schtolcconstexpr
只会让情况变得更糟。 - Marco A.