template<typename T>
T add(T a, T b){
static_assert(std::is_integral<T>::value
|| std::is_floating_point<T>::value
, "Not a numeric value");
return a + b;
}
是否有其他/更好的方法来强制执行模板约束?
答案 0 :(得分:4)
static_assert
将给出你指定的编译器错误。
enable_if
是一种替代方法,但会给出错误,表明模板未定义。这可能会使认为已定义的用户感到困惑,并且必须查看更多详细信息。
假设你想要
如果使用了错误的类型,则编译失败(除非用户为自己的类型编写了专门化)
给出的错误将是有意义的。
上面用static_assert
概述的内容似乎是实现此目标的好方法。
当然,您给了我们一个非常简单的模板,我相信您可能会考虑更复杂的模板。
答案 1 :(得分:1)
你为什么要这样做?你可以用Duck-Typing风格来做:你不检查类型是否合适,如果没有定义operator+
,它根本就不会编译。
#define RETURNS(WHAT) ->decltype(WHAT) {return WHAT;}
template<typename T>
auto add(T a, T b) RETURNS(a+b)