2013-07-19 2 views
0

Приносим извинения, если это было задано раньше - обыскали без определенного ответа, и я начинаю задаваться вопросом, возможно ли это. Я пытаюсь изучить C++ 11 и столкнулся с проблемами с вариативными шаблонами. Я думаю, что я понимаю (наконец) концепцию параметров вариационной функции и почему/как рекурсия используется для их развертывания и обработки, но у меня возникают проблемы с (по-моему) аналогичной концепцией в конструкторах классов.Возможно ли создать полностью произвольный отдельный членский кортеж в конструкторе конструктора переменных C++ 11?

Предположим, я хочу создать вариационный шаблонный класс, который имеет контейнер смешанного типа (предположим, что кортеж) является частным членом. Можно ли нажимать произвольное количество объектов с различной типизацией в этот кортеж, когда объект класса сконструирован? Что-то вроде:

#include <tuple> 

// forward declaration - is this needed? 
template <class ... args> 
class myClass; 

template <class H, class ... T> 
class myClass <H, T ...> 
{ 
private: 
    std::tuple<anything can go here> mycontainer; 
public: 
    myClass(const H& head, const T& ... tail) 
    { 
      push head into mycontainer; 
      do some sort of recursion with tail; 
    } 
} 

Я уже завинчивания вокруг с станд :: tuple_cat и станд :: make_tuple и подумал, что я на что-то на некоторое время, но не повезло.

Прошло много времени с тех пор, как я имел какое-либо отношение к C++, так что извиняюсь, если я полностью схожу с ума. Я только начал смотреть на это после некоторого чтения о возможностях C++ 11.

EDIT: Просто добавить, что я на GCC 4.8.x и/или Visual Studio 2012

+0

Обратите внимание, что версия версии VS2012 не поддерживает вариационные шаблоны: вам нужно получить выпуск компилятора CTP в ноябре 2012 года или предварительный просмотр VS2013, если вы хотите использовать переменные в VS. – Casey

+0

@ Casey: Спасибо. Я получу предварительный просмотр 2013 года. – thekamz

ответ

1

Да, можно построить элемент некоторых из этих типов переменного числа. Например:

template <class ... T> 
class myClass { 
    std::tuple<T...> mytuple; 
public: 
    // Constructor that takes const refs to the Ts and constructs tuple: 
    myclass(const T&... args) : mytuple(args...) {} 

    // Perfect forwarding constructor that will try to construct tuple 
    // from arbitrary lvalue/rvalue parameters: 
    template <class... Args> 
    myclass(Args&&... args) : mytuple(std::forward<Args>(args)...) {} 
}; 

Если вы просите что-то более конкретное, вам придется описать его более подробно.

+0

Спасибо; Мне нужно будет прочитать идеальный конструктор переадресации. Наверное, я нигде не был так подготовлен, как думал. Используя это, кажется, что можно реализовать myclass.get (int), который будет использовать функцию get (int) для std :: tuple следующим образом: 'auto get (int element) -> decltype (mytuple.get (element)) {return mytuple.get (element); } ' Но это кажется неуклюжим. Каким будет правильный путь? – thekamz

+0

Упс, я имел в виду std :: get <1> (mytuple) – thekamz

+0

OK, мой плохой, я полностью потерян. Время чтения! @Casey: Спасибо за начальный старт. – thekamz

 Смежные вопросы

  • Нет связанных вопросов^_^