2010-10-21 3 views
0

Возможно ли иметь шаблонный шаблон, а также шаблонный шаблон с другим типом?templated class с шаблоном конструктора (другого типа)

что-то вроде этого: возможно

template<typename T1> 
class Foo{ 
    template<typename T2> 
    Foo(T1 aBar, T2 dummyArgument){ 
     bar = aBar; 
     bytesOfT2 = sizeof(T2); 
    }; 

    int bytesOfT2; 
    T1 bar; 
}; 

это? и если да, как бы я назвал такой конструктор? Нужно ли мне что-то учитывать в отношении файлов заголовков и cpp?

спасибо!

// edit: мой конкретный пример на самом деле даже немного сложнее. У меня есть

template <typename U1, U2> 
class Foo{ 
    U1 var1; 
    U2 var2; 
}; 

template <typename T1> 
class Bar{ 
    template<typename T2, typename T3> 
    Bar(Foo<T2,T3> aFoo, T1 aVal){ 
     val=aVal; 
     bytesOfT2=sizeof(T2); 
     bytesOfT3=sizeOf(T3); 
    }; 

int bytesOfT2; 
int bytesOfT3; 
T1 val; 
}; 

это значит я могу здесь назвать конструктор просто с какой-либо переменной типа Foo, и он должен автоматически выбрать подходящий конструктор acording для конкретной версии Foo (например, если переменная я прохожу имеет тип Foo, если он автоматически установит T2 на bool и T3 на float)?

+0

Что ты имеешь в виду «мне нужно рассмотреть что-то в отношении заголовочных и CPP файлы?» –

+0

mmmh - по каким-то причинам (который я не помню) иногда мне приходилось ставить одну строку как «шаблонный класс Foo ;» в файл cpp, если я когда-либо хотел иметь возможность использовать класс Foo с типом типа bool. (так что мне нужно было сделать это для каждого типа, который я хотел использовать с шаблоном) – Mat

+0

Ah. Вы можете прочитать, почему это происходит в [C++ FAQ Lite] (http://www.parashift.com/c++-faq-lite/templates.html#faq-35.12) (эта запись и следующие записи обсуждают «проблема» и как вы ее решаете, эффективно, как правило, лучше всего реализовать весь шаблон в файле заголовка). –

ответ

8

Да, шаблон шаблона может иметь шаблон-конструктор. Вы называете это, как вы могли бы назвать любой другой конструктор:

Foo<int> my_foo(42, 0.0); 

Это вызывающим шаблон конструктора с T1 = int (потому что T1 является параметром шаблона класса и шаблон класса аргумент int) и T2 = double (потому что T2 шаблон функции аргумент и выводится из аргумента 0.0).

Все аргументы шаблона должны быть выведены из аргументов функции, иначе шаблон конструктора не может быть вызван. Невозможно явно указать аргументы шаблона для шаблона конструктора.

+0

ах! поэтому я могу фактически передать произвольную переменную в качестве второго аргумента, и компилятор автоматически сгенерирует для меня подходящую версию конструктора? Я даже не должен упоминать тип внутри <> скобок как-то? – Mat

+0

@Mat: Да. Вывод аргумента выполняется для шаблонов конструктора так же, как и для других шаблонов функций. –

+0

Что касается моего расширенного примера (см. Выше), будет ли он выбирать соответствующие «подтипы», если я предоставляю типизированную переменную Foo в качестве аргумента? – Mat

0

Вы можете также использовать более чем один template type:

template<typename T1, typename T2> 
class Foo{ 
public: 
    Foo(T1 aBar, T2 dummyArgument){ 
     bar = aBar; 
     bytesOfT2 = sizeof(T2); 
    } 

private: 
    int bytesOfT2; 
    T1 bar; 
}; 
+0

Я не хочу этого, я хочу, чтобы конструктор был другого типа переменной – Mat

+0

@Mat: я не получил этого ответа. :( – Donotalo

1

Да, это возможно. Что касается вызова конструктора, вы просто указываете один аргумент типа T1 и второй аргумент типа T2. Вот и все (если только не войти в терминологическую дискуссию о «вызове»).

Кстати, вместо первого по умолчанию инициализации bar, а затем назначить его, вы просто должны инициализировать его непосредственно, как

template< class T2 > 
Foo(T1 const& aBar, T2 const& dummyArgument) 
    : bar(aBar) 
    , bytesOfT2(sizeof(T2)) 
{} 

Посмотрите конструктор и инициализатор в вашем C++ учебника.

Приветствия & НТН.,

+0

ah - я не знал, что могу использовать выражения в списках инициализации - спасибо! – Mat

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