我知道这个问题提到了Boost的"静态警告",但我想再问一次,具体来说,我是如何实现一个static_warning操作方式类似static_assert但只在编译时发出警告而不是中止编译错误.
我想要类似于Alexandrescu关于在C++之前的11天中静态断言的提议,它在某种程度上设法打印了一些有用的上下文信息作为错误的一部分.
可以接受要求用户启用某些标准编译器警告以使此构造工作(可能是"无效指针转换"或"打破严格别名规则") - 任何警告应该是正常编译的一部分,无论如何都可以使用.
简而言之,我想static_warning(false, "Hello world");创建一个编译器警告,它应该以某种方式在警告消息中包含字符串"hello world".这是可能的,比如在GCC和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; }
Run Code Online (Sandbox Code Playgroud)