关于传递给模板函数sum的类型限制的技术问询
模板函数
sum的类型限制条件 对于你给出的这个模板函数:
template <class T> T sum( const T &a, const T &b) { return a+b; }
传递给它的类型T需要满足以下核心条件:
- 支持const引用绑定:
T不能是void这类无法被引用的类型,绝大多数内置类型和常规自定义类型默认都满足这一点。 - 重载了合法的加法运算符
operator+:- 要么存在全局的
operator+重载,接受两个const T&类型的参数,且返回值可隐式转换为T; - 要么
T的成员函数operator+被声明为const,能接收一个const T&参数,返回值同样可隐式转换为T。
- 要么存在全局的
- 可构造返回值:加法运算的结果必须能用来构造(或移动构造)一个
T类型对象。如果加法返回值本身就是T,那么T需要具备拷贝构造或移动构造能力(内置类型和合理设计的自定义类型都满足)。
举几个实际例子:
- 内置类型(
int、double等)天然符合所有要求,直接就能调用sum; - 标准库类型比如
std::string支持const对象的加法操作,可正常使用sum<std::string>(str1, str2); - 自定义类型需按要求实现加法,比如:
这样的class MyNum { private: int val; public: MyNum(int v) : val(v) {} // 必须声明为const,才能被const对象调用 MyNum operator+(const MyNum& other) const { return MyNum(val + other.val); } };MyNum就可以正常传递给sum函数。
内容的提问来源于stack exchange,提问作者Shir sabag
相关产品推荐
相关产品推荐

