我想这样做:
template<T>
bool AssertThrows() {
try {
T; // T is an expression, so evaluate it here
return false;
} catch(...) {
return true;
}
}
int main() {
bool throws = !AssertThrows<5 + 2>();
return !throws;
}
但这不起作用:我得到的只是这些编译错误:
$ clang++ a.cc
a.cc:1:10: error: unknown type name 'T'
template<T>
^
a.cc:4:5: error: use of undeclared identifier 'T'
T; // T is an expression
^
2 errors generated.
是否可以将表达式作为模板参数?
答案 0 :(得分:6)
模板在编译时处理,这意味着你只能使用常量表达式,其中没有一个可以抛出,所以简单的答案就是你不能做你想做的事。
虽然我在大多数情况下都反对宏,但这是它们有意义的少数几个地方之一,如果你看一下测试框架,你会发现宏是这个特定问题的通用解决方案。
答案 1 :(得分:3)
在这种情况下,如果您不介意
,则可以使用另一个函数来模拟按名称传递的函数template<typename T>
bool AssertThrows(T t) {
try {
t(); // t contains an expression, so evaluate it here
return false;
} catch(...) {
return true;
}
}
int main() {
bool throws = !AssertThrows([]{ 5 + 2; });
return !throws;
}
答案 2 :(得分:0)
模板参数可以是常量表达式,正如David指出的那样。这就是你追求的目标吗?
template<int Expr>
bool AssertThrows() {
try {
Expr; // Expr is a constant expression that 'is' an int, so evaluate it here
return false;
} catch(...) {
return true;
}
}
int main() {
bool throws = !AssertThrows<5 + 2>();
return !throws;
}