首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泛型重载运算符

泛型重载运算符
EN

Stack Overflow用户
提问于 2016-12-13 09:20:03
回答 1查看 209关注 0票数 2

我喜欢玩汽车和解密类型,然后我想知道是否有可能做通用运营商与汽车。实际上,由于c++14 et可以做到这一点:

代码语言:javascript
复制
decltype(auto) add(auto v1, auto v2) {
  return v1 + v2;
}

但是,我想尝试使用模板化的类,这些类包含像下面这样的值:

代码语言:javascript
复制
template<typename T>
class test {
 public:
  T value;
  test(T val) {
    value = val;
  }
};

然后,我需要一个重载操作符+像这样的,它可以:

代码语言:javascript
复制
template<typename T>
T operator+(test<T> const& t1, test<T> const& t2) {
    return t1.value + t2.value;
}

这已经相当不错了。但是,我想要一个通用的operator+,它可以被多个类使用。就像这个:

代码语言:javascript
复制
decltype(t1.value) operator+(auto const& t1, auto const& t2) {
    return t1.value + t2.value;
}

template<typename T>
T operator+(auto const& t1, auto const& t2) {
    return t1.value + t2.value;
}

不能编译。

在C++14/17中,是否有一种方法可以使泛型重载运算符能够被许多类使用,比如我编写的类?

PS:在这里,您的测试代码使用gcc7快照编译,但不使用clang,而clang似乎不允许自动加入函数原型:链接到编译器资源管理器代码

代码语言:javascript
复制
#include <iostream>

template<typename T>
class test {
 public:
  T value;
  test(T val) {
    value = val;
  }
};

template<typename T>
T operator+(test<T> const& t1, test<T> const& t2) {
    return t1.value + t2.value;
}

decltype(auto) add(auto v1, auto v2) {
  return v1 + v2;
}

int main() {
  decltype(5) v1 = 5;
  decltype(v1) v2 = 3;
  test<decltype(v1)> t(v1);
  test<decltype(v2)> t2(v2);

  return add(t, t2);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-13 09:26:52

如果我理解了您的问题,您可以使用尾部返回类型:

代码语言:javascript
复制
auto operator+(auto const& t1, auto const& t2) -> decltype(t1.value + t2.value) {
    return t1.value + t2.value;
}

对于不接受参数auto的编译器,只需返回两个模板参数:

代码语言:javascript
复制
template <typename U, typename V>
auto operator+(U const& t1, V const& t2) -> decltype(t1.value + t2.value) {
    return t1.value + t2.value;
}

正如@Jarod42在注释中提到的那样,您可能希望使用decltype(t1.value + t2.value)而不是decltype(t1.value)来正确地处理转换和升级。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41117387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档