2013-07-29 46 views
0

在继续这个主题Variadic template heterogeneous container,我想问以下问题。假设我们有两个动态数组成员的类。现在假设有这些类的一系列对象,这些对象被封装在异构容器中。在这个序列中,一个数组 - mebers是“输出”向量,另一个数组成员是“输入”向量,它是指向前一个对象的适当输出数组的指针。为输出矢量异构序列生成器

//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; 

}; 

我怎样才能正确地分配存储器(经由新/ malloc的),并设置输入指针输出向量前述:该序列被实现为可变参数模板类?例如,我写下一个代码:

HeterogenousContainer<A<5>, B<7>, C<9>> sequence; 

我想要输入从序列的第一成员为nullptr输入从第二 - 第一自等点输出如何正确实施?

+0

你为什么要构建链表是否可以提供对其元素的各种(包括随机)访问? – dyp

+0

假设对元素的访问将是sequental - 在上面的示例中强烈地从A到C – gorill

回答

1

通过Useless'answer启发(没有双关语意),我想出了这个:

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(); 
    } 
}; 
+0

“in”和“out”是指我的例子中的“input”和“output”? – gorill

+0

@gorill哎呀,是的。我简化了编译测试的示例;) – dyp

+0

语法 - 元素{}和元素()之间是否有区别?编译得很好 – gorill

3

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

#include <array> 
#include <tuple> 

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

您只需要对元组进行递归,并专门针对终止情况。因为第一个元素是你的特殊情况,所以我做了倒退。

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); 
    } 
} 

,并使用它是这样的:

template <typename... Arg> struct HeterogenousContainer { 
    std::tuple<Arg...> elements; 

    HeterogenousContainer() { detail::connect(elements); } 
}; 
+0

对于SSE-intrinsics的用法,是否可以将std :: array对齐16字节? – gorill

+1

不是直接。将你的'std :: array'包装成处理对齐的东西(或者使用编译器特有的属性 - 你没有说你正在使用哪个编译器),或者切换到'std :: unique_ptr'和合适的分配器。但这真是一个单独的问题。 – Useless