我知道 这个问题提到了 Boost 的“静态警告”,但是我想再问一次,具体地说,我如何能够实现一个 static_warning
,它的操作类似于 static_assert
,但是只在编译时发出一个 警告,而不是一个中止编译错误。
我希望类似于 Alexandrescu 的建议,在 pre-C + + 11天中使用静态断言,以某种方式设法打印出一些有用的上下文信息作为错误的一部分。
要求用户启用某些标准的编译器警告以使这种构造工作(可能是“无效的指针转换”或“破坏严格的别名规则”)是可以接受的——任何应该是正常编译的一部分的警告都可以使用。
简而言之,我希望 static_warning(false, "Hello world");
创建一个编译器警告,它应该以某种方式在警告消息中包含字符串“ hello world”。这可能吗,比如说在海湾合作委员会和 MSVC 中?
我很乐意给任何特别聪明的解决方案一个小小的奖励。
作为一个小小的解释: 我是在考虑 这个问题时得到这个想法的: 静态警告是一种有用的方法,可以跟踪复杂模板专门化的编译时过程,否则这些过程很难调试。静态警告可以作为编译器发出“我现在正在编译代码的这一部分”的简单信标
更新 理想情况下,警告将在以下设置中触发:
template <typename T> struct Foo
{
static_warning(std::is_pointer<T>::value, "Attempting to use pointer type.");
// ...
};
int main() { Foo<int> a; Foo<int*> b; }