我喜歡玩自動和decltype,然後我想知道是否可以用auto來做泛型運算符。事實上,由於C++ 14等可以這樣做:泛型重載運算符
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快照編譯,但不能與鐺這似乎不允許代碼自動函數原型: 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);
}
* *事實上,因爲C++ 14 et可以做到這一點:*「不,你不能。 'auto'只能用作* lambdas *中的參數佔位符。這是Concepts TS將其擴展到常規功能。而C++ 14不包括這一點。 –