通用重载运算符
Generic overloading operator
我喜欢玩 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;
}
已经很不错了。但是,我想要一个可以被多个 类 使用的通用运算符 +。喜欢这些:
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,这似乎不允许函数原型中的自动:
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);
}
如果我理解你的问题,你可以使用尾随 return 类型:
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)
来正确处理转化和促销。
我喜欢玩 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;
}
已经很不错了。但是,我想要一个可以被多个 类 使用的通用运算符 +。喜欢这些:
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,这似乎不允许函数原型中的自动: 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);
}
如果我理解你的问题,你可以使用尾随 return 类型:
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)
来正确处理转化和促销。