如何从元组中包含的数据构造对象?

时间:2013-12-05 19:26:40

标签: c++ c++11 constructor tuples variadic-templates

假设我有

struct SomeType {
  template<typename... Args>
  SomeType(Args... args);
  // ...
};

template<typename... Args> std::tuple<Args> data;   // syntax correct?

并希望根据SomeType tuple中打包的参数值构建新对象data。我怎么能这样做?

unique_ptr<SomeType> p = new SomeType( data ??? );  // how?

编辑1 我认为这个问题很清楚,但凯文不同意......我希望调用SomeBody的构造函数,其值包含在tuple {{ 1}}作为参数。知道了,Keven?


编辑2 我认为一个问题是一个问题,但Kevin再次不同意。为了他的好处,这是一个用例:我想动态构造线程局部对象,每个对象由前面提供的一些参数的线程构造。考虑

data

(例如,通过template<typename Object> class thread_specific { public: // default constructor: objects will be default constructed thread_specific(); // objects will be copy constructed from specimen provided thread_specific(Object const&specimen); // objects will be constructed from arguments provided template<typename... Args> thread_specifiv(Args... args); // return thread-specific object; objects are constructed only when needed Object& local_object(); }; 实施)。现在,如果用户使用第3个构造函数创建了一个全局std::map<std::thread::id,unique_ptr<Object>>对象,则必须以某种方式存储参数,并在需要时将其提供给thread_specific<>的构造函数,即在第一次调用{{1每个Object

1 个答案:

答案 0 :(得分:4)

使用index_sequence解压缩std::tuple(或std::pairstd::array或支持元组界面的任何其他内容:

#include <utility>
#include <tuple>

template <typename Tuple, std::size_t... Inds>
SomeClass help_make_SomeClass(Tuple&& tuple, std::index_sequence<Inds...>)
{
    return SomeClass(std::get<Inds>(std::forward<Tuple>(tuple))...);
}

template <typename Tuple>
SomeClass make_SomeClass(Tuple&& tuple)
{
    return help_make_SomeClass(std::forward<Tuple>(tuple),
        std::make_index_sequence<std::tuple_size<Tuple>::value>());
}

std::index_sequencestd::make_index_sequence将使用C ++ 1y。如果找不到定义它们的标题,可以使用以下命令:

template <std::size_t... Inds>
struct index_sequence {
    static constexpr std::size_t size()
    { return sizeof...(Inds); }
};

template <std::size_t N, std::size_t... Inds>
struct help_index_seq {
    typedef typename help_index_seq<N-1, N-1, Inds...>::type type;
};

template <std::size_t... Inds>
struct help_index_seq<0, Inds...> {
    typedef index_sequence<Inds...> type;
};

template <std::size_t N>
using make_index_sequence = typename help_index_seq<N>::type;

实例,在C ++ 11模式下:http://coliru.stacked-crooked.com/a/ed91a67c8363061b