假设我有一个功能:
template<typename T, typename Dummy =
typename std::enable_if<std::is_integral<T>::value,int>::type >
void foo(T var0, T var1);
仅当T
是某种整数类型时才会创建此函数。唯一的问题是,如果我尝试在非整数类型上使用它,我会收到这个巨大的错误。
有没有办法创建在类似场景中发生的自定义错误字符串?
答案 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中进行实验性实施。