gpt4 book ai didi

c++ - 通用重载运算符

转载 作者:行者123 更新时间:2023-11-30 02:28:06 26 4
gpt4 key购买 nike

我喜欢玩 auto 和 decltype,然后我想知道是否可以用 auto 做泛型运算符。事实上,由于 c++14 et 可以做到这一点:

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

但是,我想尝试使用包含如下值的模板类:

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

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

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,这似乎不允许函数原型(prototype)中的自动: link to compiler explorer code

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

最佳答案

如果我理解你的问题,你可以使用尾随返回类型:

auto operator+(auto const& t1, auto const& t2) -> decltype(t1.value + t2.value) {
return t1.value + t2.value;
}

对于不接受 auto 参数的编译器,您可以简单地退回到两个模板参数:

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) 来正确处理转换和促销。

关于c++ - 通用重载运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41117387/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com