在 c++17 中,我们可以滥用该[[deprecated]]
属性来强制编译器发出包含所需模板参数的警告:
template<typename T>
[[deprecated]] inline constexpr void print_type(T&& t, const char* msg=nullptr){}
print_type(999, "I just want to know the type here...");
上面的代码片段将使用 gcc 打印以下警告:
<source>:32:59: warning: 'constexpr void print_type(T&&, const char*) [with T = int]' is deprecated [-Wdeprecated-declarations]
print_type(999, "I just want to know the type here...");
与接受的答案相反,这将适用于每个符合 c++17 的编译器。请注意,您必须在 MSVC 上启用 \W3`。
我们甚至可以更进一步,定义一个静态断言宏,当且仅当它失败时才会打印类型。
template<bool b, typename T>
inline constexpr bool print_type_if_false(T&& t) {
if constexpr (!b)
print_type(std::forward<T>(t));
return b;
}
// Some nice static assert that will print the type if it fails.
#define STATIC_ASSERT(x,condition, msg) static_assert(print_type_if_false<condition>(x), msg);
这是一个活生生的例子。