c++ - 没有元组的 Variadics 模板

标签 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(){
    //???
}

最佳答案

从理论上讲,您可以通过提供额外的包装器在 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]

关于c++ - 没有元组的 Variadics 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46950047/

相关文章:

c++ - 性能、C++ 代码和生成的汇编代码

C++:BOOST-bind 错误:没有匹配的函数可用于调用 'bind(<未解析的重载函数类型>, ...?

c++ - 在可变扩展中排序

function - 如何处理 Scheme 中未指定数量的参数?

c++ - 如何将uint32_t数字转换为char [8]?

c++ - 组合多个类模板特化

Variadic 模板的 C++ 错误

C++ 11可变数量的参数,相同的特定类型

C++11 可变类处理程序管理器

c++ - 可以安全地使用指向其他类/结构中的项的指针吗?