我对 C++ 很陌生。我编写了一个函数模板来对向量中的所有元素求和,如下所示:
template<typename T>
inline T sumator(const std::vector<T> &sequence) {
T init = T{};
return accumulate(sequence.begin(), sequence.end(), init);
}
Run Code Online (Sandbox Code Playgroud)
一切正常,直到默认构造函数没有声明,而是从例如 2 个参数声明构造函数。像这样:
class A {
private:
int a;
int b;
public:
// A() = default;
A(int aa, int bb) : a(aa),b(bb){};
A operator+(const A &right) const {
return {a + right.a, b + right.b};
}
bool operator==(const A &right) const {
return (a == right.a && b == right.b);
}
};
vector<A> bc = {{3,5},{5,5}};
A res = Adder::sumator(works);
A result = {8,10};
assert(result,res);
Run Code Online (Sandbox Code Playgroud)
现在我收到一个错误,如:错误:没有匹配的构造函数用于初始化 'A' T init = T{};
我怎样才能避免这种情况,而不是使用https://en.cppreference.com/w/cpp/types/is_default_constructible
UPD:我有很多类,其中一些带有默认构造函数,一些没有但带有 2 个 arg 的构造函数,一些用于 3 等而且我想很好地积累每种情况
我能想到的可能解决方案。
std::accumulate通过提供初始值让用户依赖。sumator初始值的重载。如果用户的类型没有默认构造函数,则用户可以使用初始值调用重载。template<typename T>
inline T sumator(const std::vector<T> &sequence, T init) {
return accumulate(sequence.begin(), sequence.end(), init);
}
template<typename T>
inline T sumator(const std::vector<T> &sequence) {
return accumulate(sequence.begin(), sequence.end(), {});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
167 次 |
| 最近记录: |