Пусть у меня естьКак построить объект из данных, упакованных в кортеж?
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
data
в качестве аргументов. Получил это, Кевен?
редактировать 2 Я думал вопрос вопрос, но Кевин опять не согласен. Для его пользы здесь используется прецедент: я хочу динамически строить поточно-локальные объекты, каждая из которых построена по потоку из некоторых аргументов, предоставленных ранее. Рассмотрим
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();
};
(реализована, скажем, через std::map<std::thread::id,unique_ptr<Object>>
). Теперь, если глобальный объект thread_specific<>
создается пользователем с использованием 3-го конструктора, аргументы должны быть как-то сохранены и переданы в конструктор Object
, когда это необходимо, то есть при первом вызове thread_specific<>::local_object()
на каждом std::thread
.
Вы хотите сделать копию кортежа? Тот же материал, другое имя? Вы хотите ввести typedef или что вы хотите сделать? Знание того, как оно будет использоваться, вероятно, поможет. –
related: http://stackoverflow.com/questions/7858817/unpacking-a-tuple-to-call-a-matching-function-pointer или http://stackoverflow.com/questions/687490/how-do-i -expand-a-tuple-into-variadic-template-functions-arguments –
@NateKohl да, я это видел. Нет принятого ответа. Ответ с наивысшим рангом использует некоторую рекурсию. Интересно, можно ли это сделать быстрее и/или если стандарт обеспечивает определенную поддержку. – Walter