【发布时间】:2018-03-31 11:11:49
【问题描述】:
我想知道接下来是否可以做。
例如,我有以下带有constexpr 构造函数、getter 和operator+() 的模板类。
#include <cstdint>
#include <cassert>
template <typename T, std::size_t NumEl>
class MyContainer {
public:
// constructor
template <typename... Args>
MyContainer(Args... tail): values{T(tail)...} {
static_assert(sizeof...(Args) == NumEl, "wrong number of arguments");
}
template<uint8_t Index>
constexpr T& get() {
return values[Index];
}
constexpr auto operator +(const MyContainer<T, NumEl>& other) {
// no idea here
return MyContainer<T, NumEl>() ;
}
private:
T values[NumEl];
};
int main() {
MyContainer<double, 3> a(0.0, 1.0, 3.0);
MyContainer<double, 3> b(1., 2.0, 5.0);
assert(a.get<0>() == 0.0);
assert(a.get<1>() == 1.0);
auto c = a + b;
assert(c.get<0>() == 1.0);
assert(c.get<1>() == 3.0);
assert(c.get<2>() == 8.0);
return 0;
}
我想使用get() 函数和可变构造函数来实现operator+(),我卡在这里。如果我将使用 sum 创建一个数组,我知道如何为可变参数构造函数创建一个元组。但我不能简单地写
T sumVals[NumEl] = {0};
for (int i = 0; i < NumEl; ++i) {
sumVals = values[i] + other.get<i>();
由于get<i>() 产生编译错误。我假设我应该使用递归模板,但不知道如何实现。
所以,问题是在这种情况下如何实现operator+()。
谢谢!
【问题讨论】:
-
为什么那个模板是
get而不是constexpr T& operator[],比如this?
标签: c++ templates c++14 variadic-templates template-meta-programming