【发布时间】:2021-02-07 10:25:06
【问题描述】:
我正在尝试创建一个函数AddVector,它可以明智地添加(可变)数量的向量元素。我想我明白了,但是当我得到错误的输出时,我显然没有。我正在添加三个双精度向量,每个大小为 5,包含 1+2+1,因此我期望
4 4 4 4 4
我明白了
1.36234e-316 2.0326e-316 4 4 4
这显然是错误的(可能是未初始化的内存?)
我使用 CppInsights 查看了翻译后的代码,但这似乎还可以。我在这里做错了什么?
我的代码:
#include <vector>
template<typename T>
using Vec = std::vector<T>;
template<typename T>
auto SumAndIncVcIt(T& t) {
return *t++;
}
template<typename T, typename... Args>
auto SumAndIncVcIt(T& t, Args&... args) {
return *t++ + SumAndIncVcIt(args...);
}
#include <tuple>
template<typename... Args>
auto VcBegins(Args... args){
return std::make_tuple(cbegin(args)...);
}
template<typename T, size_t... Is>
auto SumAndIncVcIts_impl(T& t, std::index_sequence<Is...>) {
return SumAndIncVcIt(std::get<Is>(t)...);
}
template<class Tuple>
auto SumAndIncVcIts(Tuple& t) {
return SumAndIncVcIts_impl(t,
std::make_index_sequence<std::tuple_size<Tuple>{}>{}
);
}
template<typename T, typename... Args>
Vec<T> AddVector(Vec<T> const& vt, Vec<Args> const&... vargs){
auto vret = Vec<T>(size(vt));
auto vcIts = VcBegins(vt, vargs...);
auto retIt = begin(vret);
while(retIt != end(vret)){
*retIt++ = SumAndIncVcIts(vcIts);
}
return vret;
}
#include<iostream>
int main() {
constexpr auto size = 5;
Vec<double> a(size, 1.0), b(size, 2.0);
auto c = AddVector(a, b, a);
for(auto const& el : c){
std::cout << el << " ";
}
}
附言是的,我应该使用 SFINEA 或概念。
【问题讨论】:
标签: c++ c++17 variadic-templates undefined-behavior