有没有办法让 static_assert 的字符串被动态定制然后显示?
我的意思是这样的:
//pseudo code
static_assert(Check_Range<T>::value, "Value of " + typeof(T) + " type is not so good ;)");
有没有办法让 static_assert 的字符串被动态定制然后显示?
我的意思是这样的:
//pseudo code
static_assert(Check_Range<T>::value, "Value of " + typeof(T) + " type is not so good ;)");
不,那里没有。
然而这并不重要,因为static_assert
是在编译时评估的,如果出现错误,编译器不仅会打印出消息本身,还会打印实例化堆栈(在模板的情况下)。
看看ideone中的这个合成示例:
#include <iostream>
template <typename T>
struct IsInteger { static bool const value = false; };
template <>
struct IsInteger<int> { static bool const value = true; };
template <typename T>
void DoSomething(T t) {
static_assert(IsInteger<T>::value, // 11
"not an integer");
std::cout << t;
}
int main() {
DoSomething("Hello, World!"); // 18
}
编译器不仅会发出诊断信息,还会发出完整的堆栈:
prog.cpp: In function 'void DoSomething(T) [with T = const char*]':
prog.cpp:18:30: instantiated from here
prog.cpp:11:3: error: static assertion failed: "not an integer"
如果您了解 Python 或 Java 以及它们如何在异常情况下打印堆栈,那么您应该很熟悉。事实上,它甚至更好,因为您不仅可以获得调用堆栈,还可以获得参数值(此处的类型)!
因此,动态消息不是必需的:)
该标准将第二个参数指定为static_assert
字符串文字,因此据我所知,没有机会在那里进行计算(预处理器宏除外)。
编译器可以扩展标准并在此位置允许适当类型的 const 表达式,但我不知道是否有任何编译器这样做。
As Matthieu said, it's not possible, but you can get some of the functionalities you're looking for by using macros:
#define CHECK_TYPE_RANGE(type)\
static_assert(Check_Range<type>::value, "Value of " #type " type is not so good ;)");
CHECK_TYPE_RANGE(float); // outputs "Value of float type is not so good ;)"