首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异构序列发生器

异构序列发生器
EN

Stack Overflow用户
提问于 2013-07-29 21:34:28
回答 2查看 285关注 0票数 0

为了继续讨论这个主题Variadic template heterogeneous container,我想问以下几个问题。假设有几个类具有两个成员,即动态数组。现在假设这些类的对象序列被打包在异构容器中。在这个序列中,数组中的一个是“输出”向量,另一个数组成员是“输入”向量,它是指向来自前一个对象的适当输出数组的指针。此序列作为可变模板类实现:

代码语言:javascript
复制
//Classes, objects which are members of the sequence
template<int NumberElements>
struct A 
{
    A() : output(new float[NumberElements]){}//allocate output
    ~A(){delete[] output;}
    float *input;//input vector - pointer to output vector from preceding object of sequence 
    float *output;// output vector (size - NumberElements) of current member of sequence
};   
template<int NumberElements> 
struct B 
{
    B() : output(new float[NumberElements]){}//allocate output
     ~B(){delete[] output;}
    float *input;
    float *output;
};
template<int NumberElements>    
struct C 
{
    C() : output(new float[NumberElements]){}//allocate output
    ~C(){delete[] output;}
    float *input;
    float *output;
};

//Container
template<typename...Arg>
struct HeterogenousContainer
{
    HeterogenousContainer();//Do something to setup the sequence
    std::tuple<Arg...> elements;

};

如何正确分配内存(通过new/malloc)用于输出向量,并设置指向前面的输出向量的输入指针?例如,我编写了下一段代码:

代码语言:javascript
复制
HeterogenousContainer<A<5>, B<7>, C<9>> sequence;

我希望序列的第一个成员的输入nullptr输入从第二个点到输出,等等,如何正确地实现它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-29 22:20:54

Useless' answer (无意中的双关语)的启发,我想到了以下几点:

代码语言:javascript
复制
template<typename...Arg>
struct HeterogenousContainer
{
    std::tuple<Arg...> elements;

    void init(std::integral_constant<std::size_t, 0>)
    {
        std::get<0>(elements).input = nullptr;
    }

    template < std::size_t index = sizeof...(Arg)-1 >
    void init(std::integral_constant<std::size_t, index> = {})
    {
        std::get<index>(elements).input = std::get<index-1>(elements).output;
        init(std::integral_constant<std::size_t, index-1>{});
    }

    HeterogenousContainer()
        : elements{}
    {
        init();
    }
};
票数 1
EN

Stack Overflow用户

发布于 2013-07-29 22:02:33

首先,如果你能避免手动分配的话,不要乱搞。对于一个简单的数组,您可以:

代码语言:javascript
复制
#include <array>
#include <tuple>

template<int NumberElements>
struct A 
{
    float *input;
    std::array<float, NumberElements> output;
};

您只需要恢复元组,并专门处理终止案例。我倒着做,因为第一个元素是你的特例。

代码语言:javascript
复制
namespace detail {
    template <int N> struct Connector;

    template <>
    struct Connector<0> {
        template <typename... TL> static void connect(std::tuple<TL...> &t) {
            std::get<0>(t).input = nullptr;
        }
    };

    template <int N> struct Connector {
        template <typename... TL> static void connect(std::tuple<TL...> &t) {
            std::get<N>(t).input = &std::get<N-1>(t).output.front();
            Connector<N-1>::connect(t);
        }
    };

    template <typename... TL> void connect(std::tuple<TL...> &t) {
        Connector<sizeof...(TL)-1>::connect(t);
    }
}

然后用这样的方法:

代码语言:javascript
复制
template <typename... Arg> struct HeterogenousContainer {
    std::tuple<Arg...> elements;

    HeterogenousContainer() { detail::connect(elements); }
};
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17934626

复制
相关文章

相似问题

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