我的目标是能够在std :: vector上使用算术运算符.请考虑以下示例:
#include <vector>
using namespace std;
template <class S, class T, class U> vector<U> operator+(const vector<S> &a, const vector<T> &b){
vector<U> result;
result.reserve(a.size());
for(int i = 0; i < a.size();++i){
result[i] = a[i] + b[i];
}
return result;
}
int main(int argc, char** argv) {
vector<double> bla;
bla = bla + bla;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码无法编译,因为编译器无法推导出模板参数U(它不是MWE,但我试图提供一个有意义的示例).为什么会这样?我知道在这里使用三个模板参数可能没有意义.我的想法是,在类型S和T都提供匹配的"+" - 具有不同返回类型的实现的情况下,我可以同时处理这两种情况.或者是歧义问题?我只是想知道编译器是否应该无法推导出U.当然下面的代码工作正常:
#include <vector>
using namespace std;
template <class S, class T> vector<S> operator+(const vector<S> &a, const vector<T> &b){
vector<S> result;
result.reserve(a.size());
for(int i = 0; i < a.size();++i){
result[i] = a[i] + b[i];
}
return result;
}
int main(int argc, char** argv) {
vector<double> bla;
bla = bla + bla;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您可以使用通用类型来完成此任务
#include <vector>
#include <type_traits>
using namespace std;
template <class S, class T>
vector<typename std::common_type<S, T>::type> operator+(const vector<S> &a, const vector<T> &b)
{
vector<typename std::common_type<S, T>::type> result;
result.reserve(a.size());
for(unsigned int i = 0; i < a.size();++i){
result[i] = a[i] + b[i];
}
return result;
}
int main() {
vector<double> bla;
bla = bla + bla;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑:正如 Jarod42 建议的那样,您也可以使用vector<decltype(a[0] + b[0])>另一种可能的返回类型(可能与 common_type 不同)。请记住,后一个需要尾随返回类型或std::declval (C++11)
| 归档时间: |
|
| 查看次数: |
7624 次 |
| 最近记录: |