Variadics模板没有元组

时间:2017-10-26 09:03:16

标签: c++ variadic-templates variadic

我从事一个非常特别的项目,因为我不能使用所有的C ++ 11功能。特别是,我有variadics模板,但没有tuple。 我努力做的是创建一个可以存储元数据的模板类,即一组数据。我事先并不知道使用了什么类型,以及会有多少类型。 基本上,这就是我想做的事情

#include<tuple>
template<typename... Data>
class Base{
 private:
std::tuple<Data...> mydata;

public:
Base{Data... data):
    mydata(data...){}

void set_data(Data... data){
    mydata = std::tie(data...)
}

这个例子正在运作......但依赖于tuple。我知道我可以使用tuple在没有ArgumentPack的情况下执行类似操作。但是,我对此并不熟悉。

到目前为止,我考虑使用struct来存储我的数据,因为它是我知道存储不同类型的唯一方式。所以我应该这样:

template<typename typename<...> class ArgumentPack, typename... Data>
class Base{
 private:
struct mydata{
//Something here
};

public: 
Base(Data... data){
    //assign data into mydata struct
}

void set_data(Data... data){
    //???
}

mydata get_data(){
    //???
}

2 个答案:

答案 0 :(得分:4)

理论上,你可以通过提供额外的包装来在Vittorio的方法上构建一个更复杂的结构。这个实际上允许相同类型的多个数据以及原始类型。方法的草图(使用c ++ 14来完成index_sequence内容,但是can be reimplemented in c++11 without std as well):

#include <utility>
#include <iostream>

template <class... Ts>
struct Pack {};

template <std::size_t, class T>
struct Wrapper {
    T t;
    Wrapper(T t): t(t) { }
};

template <class... Ts>
struct Foo: Foo<Pack<Ts...>, std::make_index_sequence<sizeof...(Ts)>> { 
    using  Foo<Pack<Ts...>, std::make_index_sequence<sizeof...(Ts)>>::Foo;
};

template <class... Ts, std::size_t... Is>
struct Foo<Pack<Ts...>, std::index_sequence<Is...>>: Wrapper<Is, Ts>... {
    Foo(Ts... ts):Wrapper<Is, Ts>(ts)... { }
    void set_data(Ts... ts) {
        this->~Foo();
        new (this) Foo (ts...);
    }
    template <std::size_t I, class T>
    static T& get_data_impl(Wrapper<I, T>* th) {
        return th->t;
    }
    template <std::size_t I>
    auto get_data() -> decltype(get_data_impl<I>(this)) {
        return get_data_impl<I>(this);
    }
};

int main() {
    Foo<int, float, int> foo(1, 2.0f, 3);
    foo.set_data(3, 2, 1);
    std::cout << foo.get_data<2>() << std::endl;
}

[live demo]

答案 1 :(得分:3)

如果你的类型都不同而且不是原始类型,你可能会失去继承:

template <typename... Data>
class Base : Data...
{
};

否则,您应该使用提供tuple的库或实现您自己的库。 E.g。boost::tuple