首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用未知数量的std::array创建函数

使用未知数量的std::array创建函数
EN

Stack Overflow用户
提问于 2019-11-29 17:49:13
回答 1查看 47关注 0票数 1

我正在尝试创建一个通过该测试的函数:

代码语言:javascript
复制
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);
}

我已经编写了该函数:

代码语言:javascript
复制
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是相同的)。

我得到了那个错误,无法理解如何解决它们..

代码语言:javascript
复制
../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);
EN

回答 1

Stack Overflow用户

发布于 2019-11-29 18:08:23

下面是a C++17 way来做这件事,但我认为它并不是很好:

代码语言:javascript
复制
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;
}

https://godbolt.org/z/ha9NSY

此函数接受任意数量的类型相同但大小可能不同的std::array。(如果你愿意,你可以不允许不同的大小,留给读者作为练习。)

我们在编译时(constexpr)计算总大小(通过将文件夹表达式中的所有N求和),然后创建该大小的返回数组。

接下来,丑陋的部分:我们想对每个变量参数执行一些操作,所以我们在逗号运算符上使用了一个折叠表达式。我们希望将当前的可变参数(arrays)复制到retArray的正确部分。值得庆幸的是,std::copy为输出返回了一个更新的迭代器,因此我们可以使用它来跟踪复制到哪里。请注意,您需要在逗号操作的表达式(迭代器赋值)和整个折叠表达式周围使用括号。

它是有效的,但再说一次,并不美观。它甚至不是constexpr (因为std::copy不是constexpr)……

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59102417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档