我正在尝试创建一个通过该测试的函数:
TEST(MyCat, CheckOn2Arrays){
std::array<float, 3> vec1{1.0f, 2.0f, 3.0f};
std::array<float, 3> vec2{4.0f, 5.0f, 6.0f};
std::array<float, 6> r = MyCat(vec1, vec2);
EXPECT_EQ(r[0], 1.0f);
EXPECT_EQ(r[1], 2.0f);
EXPECT_EQ(r[2], 3.0f);
EXPECT_EQ(r[3], 4.0f);
EXPECT_EQ(r[4], 5.0f);
EXPECT_EQ(r[5], 6.0f);
}我已经编写了该函数:
template<class T, size_t N>
auto MyCat((std::array<T, N>) ... arrays) ->
decltype(std::array<T, N*sizeof...(arrays)>) {
std::array<T, sizeof...(arrays)*N> retArray;
int i = 0;
for(std::array<T, N> array: arrays){
T* = array.begin();
while(!T){
retArray[i] = &T;
i++;
T++;
}
}
return retArray;
}该函数必须接受任意数量的参数,并返回std::array类型的对象。所有参数的类型都是std::array (对于所有函数参数,T和N是相同的)。
我得到了那个错误,无法理解如何解决它们..
../src/test/../myproject/MyCat.h:4:29: error: expected primary-expression before ‘)’ token
auto MyCat((std::array<T, N>) ... arrays) ->
^
../src/test/../myproject/MyCat.h:4:6: warning: variable templates only available with
std=c++14 or -std=gnu++14
auto MyCat((std::array<T, N>) ... arrays) ->
^
../src/test/../myproject/MyCat.h:4:43: error: expected ‘;’ before ‘->’ token
auto MyCat((std::array<T, N>) ... arrays) ->
^
../src/test/MyCat_test.cc: In member function ‘virtual void
MyCat_CheckOn2Arrays_Test::TestBody()’:
../src/test/MyCat_test.cc:10:35: error: missing template arguments before ‘(’ token
std::array<float, 6> r = MyCat(vec1, vec2);发布于 2019-11-29 18:08:23
下面是a C++17 way来做这件事,但我认为它并不是很好:
template<class T, std::size_t ... N>
auto MyCat(std::array<T, N> ... arrays)
{
constexpr std::size_t NSum = (N + ...);
std::array<T, NSum> retArray;
auto outIt = retArray.begin();
((outIt = std::copy(arrays.begin(), arrays.end(), outIt)), ...);
return retArray;
}此函数接受任意数量的类型相同但大小可能不同的std::array。(如果你愿意,你可以不允许不同的大小,留给读者作为练习。)
我们在编译时(constexpr)计算总大小(通过将文件夹表达式中的所有N求和),然后创建该大小的返回数组。
接下来,丑陋的部分:我们想对每个变量参数执行一些操作,所以我们在逗号运算符上使用了一个折叠表达式。我们希望将当前的可变参数(arrays)复制到retArray的正确部分。值得庆幸的是,std::copy为输出返回了一个更新的迭代器,因此我们可以使用它来跟踪复制到哪里。请注意,您需要在逗号操作的表达式(迭代器赋值)和整个折叠表达式周围使用括号。
它是有效的,但再说一次,并不美观。它甚至不是constexpr (因为std::copy不是constexpr)……
https://stackoverflow.com/questions/59102417
复制相似问题