是否可以传递包含lt或gt运算符的表达式作为模板参数?

时间:2015-02-04 16:47:53

标签: c++ templates

我认为以下程序格式正确:

#include <iostream>

template <bool>
void foo(){ };

int a = 4;
int b = 5;
int main(){ foo<a<b>(); }

DEMO

我这样思考的原因是(N4296::14.2/3 [temp.names]):

  

名称查找(3.4)后发现名称是template-name或那个   operator-function-idliteral operator-id是指一组   重载函数的任何成员是函数模板,如果   接下来是<<始终作为a的分隔符   template-argument-list而不是小于运营商。什么时候   在解析template-argument-list时,会采用第一个非嵌套>   作为结束分隔符而不是大于运算符。

在该示例中,我们可以看到<表达式中的第一个foo<a<b>()被视为模板参数的起点。模板参数最多为第一个>,因此a<b应被视为参数。但事实并非如此,这有什么不对?

2 个答案:

答案 0 :(得分:7)

是的,只要表达式是编译时常量表达式,这是可能的。

您需要做的就是让int成为constexpr。您可能希望为代码的人类读者在表达式周围添加括号(编译器在正确解析foo<a<b>时没有问题,而人类会认为最后缺少>

constexpr int a = 4;
constexpr int b = 5;
int main(){ foo<(a<b)>(); return 0;}

Demo.

答案 1 :(得分:2)

仅当a<ba都是编译时常量时,

b才是编译时常量。

这对我有用:

#include <iostream>

template <bool>
void foo(){ };

const int a = 4;
const int b = 5;
int main(){ foo<a<b>();}