有没有一种方法可以在std::conditional fail上给出更好的错误

Is there a way to give better errors on std::conditional fail?

本文关键字:fail conditional 错误 更好 std 一种 方法 有没有      更新时间:2023-10-16

假设我有一个函数:

template<typename T, typename Dummy =
                           typename std::enable_if<std::is_integral<T>::value,int>::type >
void foo(T var0, T var1);

只有当T是某种积分类型时,才会创建此函数。唯一的问题是,如果我试图在非积分类型上使用它,我会得到这个巨大的错误。

有没有任何方法可以创建类似场景中发生的自定义错误字符串?

只需放弃Dummy技巧并使用static_assert,这就像教科书中的用例:

#include <type_traits>
template <class T>
void fun(T t){
    static_assert(std::is_integral<T>::value, "fun requires integral");
}
int main(){
    fun(1);
    fun(2.);
}

失败,并显示非常清晰的信息:

main.cpp: In instantiation of 'void fun(T) [with T = double]':
main.cpp:10:11:   required from here
main.cpp:5:5: error: static assertion failed: fun requires integral
     static_assert(std::is_integral<T>::value, "fun requires integral");
     ^~~~~~~~~~~~~

在或多或少遥远的未来,2020年左右,你也可以为此使用概念,如果你想玩的话,gcc中有一个实验性的实现。