有没有办法在std :: condition失败时给出更好的错误?

时间:2016-05-12 23:09:11

标签: c++ templates compiler-errors

假设我有一个功能:

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

仅当T是某种整数类型时才会创建此函数。唯一的问题是,如果我尝试在非整数类型上使用它,我会收到这个巨大的错误。

有没有办法创建在类似场景中发生的自定义错误字符串?

1 个答案:

答案 0 :(得分:3)

只需删除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年左右的某个或多或少的遥远未来,您也可以使用concepts,如果您想要使用它,可以在gcc中进行实验性实施。