假设我有
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
。
答案 0 :(得分:4)
使用index_sequence
解压缩std::tuple
(或std::pair
,std::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_sequence
和std::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