шаблонный класс с шаблонным конструктором (другого типа) - PullRequest
0 голосов
/ 21 октября 2010

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

как то так:

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, и он должен автоматически выбирать правильный конструктор в соответствии с конкретной версией Foo (например, если передаваемая мной переменная имеет тип Foo, если она автоматически устанавливается Т2, чтобы кипеть и Т3, чтобы плавать)?

Ответы [ 3 ]

8 голосов
/ 21 октября 2010

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

Foo<int> my_foo(42, 0.0);

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

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

1 голос
/ 21 октября 2010

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

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

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

Найдите конструкторы и инициализаторы в вашем учебнике по C ++.

Приветствия & hth.,

0 голосов
/ 21 октября 2010

Вы также можете использовать более одного 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;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...