C ++ 11中的模板约束

时间:2014-08-21 11:49:56

标签: c++ c++11

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;
}

是否有其他/更好的方法来强制执行模板约束?

2 个答案:

答案 0 :(得分:4)

如果有人试图用不合适的类型调用模板,那么你使用的

static_assert将给出你指定的编译器错误。

enable_if是一种替代方法,但会给出错误,表明模板未定义。这可能会使认为已定义的用户感到困惑,并且必须查看更多详细信息。

假设你想要

  1. 如果使用了错误的类型,则编译失败(除非用户为自己的类型编写了专门化)

  2. 给出的错误将是有意义的。

  3. 上面用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)