c++ 11中的模板约束

Template constraints in C++11

本文关键字:约束 c++      更新时间:2023-10-16
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;
}

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

如果有人试图用不合适的类型调用模板,您使用的static_assert将给出您指定的编译器错误。

enable_if是另一种选择,但会给出模板未定义的错误。这很可能会让用户感到困惑,他们认为它已经定义好了,而必须查看更多的细节。

假设你想要

  1. 如果使用了不正确的类型编译失败(除非用户为自己的类型编写了专门化)

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

你上面概述的static_assert似乎是实现这一目标的好方法。

当然你给了我们一个非常简单的模板,我相信你很可能会考虑一个更复杂的。

你为什么要这样做?你可以用Duck-Typing风格来做:你不检查类型是否合适,如果没有定义operator+,它就不会编译。

#define RETURNS(WHAT) ->decltype(WHAT) {return WHAT;}
template<typename T>
auto add(T a, T b) RETURNS(a+b)