我很想警告自己或其他人,当他们使用自动无声转换的 T,U 类型模板时,这可能是一个有问题的用例,以便程序员可以验证该模板是否合适(或者他们是否在元逻辑中的某个地方犯了错误(。
但是我无法辨别如何生成这样的编译时警告,该警告以任何方式命名类型或引用调用方的代码?
如果是失败案例 - 那么我可以发出static_assert或类似命令来强制编译器失败,然后用户将在输出诊断中看到最初触发失败案例的内容。
但是一个有问题的用例呢? 不一定是错误...只是一个警告?
下面是我的意思的一个例子:
template <typename T, typename U>
bool within(T value, U minimum, U maximum)
{
// WARNING: we force U to be a T silently
//#pragma message("Forcing " typeid(U).name() " to a " typeid(T).name())
#pragma message("Possible casting danger is happening in this template - check your types!")
return static_cast<T>(minimum) <= value && value <= static_cast<T>(maximum);
}
在这里,我不知道如何命名T和U,也不知道如何返回调用者的代码......
我想我想要一个
static_warning(condition, "optional text which somehow also produces the actual typename of T and U");
想法?
好的 - 所以我很想听听社区关于生成编译时类型相关警告消息的方法......
但与此同时,我意识到 C++17 实际上具有我在这种情况下和类似 (T,U( 静脉所需的解决方案:
// this will only compile if there is a common type for T and U! Neat! :D
template <typename T, typename U, typename Z = std::common_type_t<T,U>>
bool within(T value, U minimum, U maximum)
{
return static_cast<Z>(minimum) <= value && value <= static_cast<Z>(maximum);
}