2013-04-23 4 views
1

Я не совсем уверен, что я выбираю правильный подход здесь, так что я обрисовать проблему первый:Шаблон удобства конструктор для наследования

Мне нужен базовый класс (может быть абстрактным), что имеет место конструктор удобства для всех его дочерних элементов, который возвращает статический экземпляр этого дочернего элемента плюс принимает параметр типа boost::tuple<std::string> или boost::tuple<short, int>.

Что мой базовый класс выглядит следующим образом:

class BaseClass{ 

public: 

    template<typename TCLASS, typename TUPLE> 
    static TCLASS* createPacketFromStruct(TUPLE s){ 
     TCLASS* p = new TCLASS(); 
     p->structure = s; 
     p->createMessageFromStruct(); 
     return p; 
    } 
}; 

Но я не могу получить статический экземпляр из этого шаблона.

+1

Вопрос для меня совершенно неясен. Почему 'createPacketFromStruct' является (статическим) членом класса, а не некоторой свободной функцией? Является ли 'TCLASS' производным от' BaseClass'? Является ли 'структура' частной? Также: 'boost :: tuple' или' boost :: tuple' не имеет смысла. –

+0

Я хочу использовать его в качестве конструктора, такого как BaseClass * c = BaseClass :: creasePacketFromStruct (...); структура действительно является частной и меняется от ребенка к ребенку; Я отредактировал текст (затерялся) в соответствии с вашими предложениями. – dos

+0

Тогда в чем проблема? Что вы подразумеваете под «Я не могу получить статический экземпляр из этого шаблона»? (Вы также должны взять 'TUPLE && s' в качестве параметра и использовать' p-> structure = std :: forward (s); ') –

ответ

1

Вы должны быть в состоянии вызвать функцию следующим образом:

MyClass* myClass = BaseClass::template createPacketFromStruct<MyClass,MyTuple>(s); 

Если вы хотите, чтобы компилятор выводить параметры шаблона, изменить сигнатуру функции, чтобы взять дополнительный параметр типа TCLASS** и назвать его как так:

MyClass* myClass; 
BaseClass::template createPacketFromStruct(&myClass, s); 

(не уверен, что если template действительно необходимо, может быть BaseClass::createPacketFromStruct(&myClass, s); работает хорошо)

0

Кажется, ваш вопрос заключается в том, как назвать метод, который вы написали? В этом случае следующее должно быть легче, чем другой ответ:

MyClass* myClass = BaseClass::createPacketFromStruct<MyClass>(s); 

template ключевое слово не требуется, как BaseClass не сам шаблон. Кроме того, вам не нужно указывать второй параметр шаблона.