Шаблон C ++: что произойдет, если мы поместим неправильную вещь в наш шаблон - PullRequest
0 голосов
/ 02 июля 2011

C ++ шаблоны позволяют нам помещать все что угодно в наши объекты с аргументами шаблона.Однако, если в наших аргументах шаблона используются функции / переменные, которые принадлежат к определенным типам, как мы проверяем?

template<typename BarType>rguments

class Foo {

public:

     Foo() { bar = new BarType() }

private:

     BarType * bar;

}

Foo<Bar> …

BarType может быть чем угодно, полученным из суперкласса Bar.

Что произойдет, если мывызвать некоторые функции, которые принадлежат только Bar в нашем классе Foo?Что произойдет, если мы передадим не BarType?Мы все равно должны проверить?

Ответы [ 4 ]

4 голосов
/ 02 июля 2011

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

Думайте о шаблонах как о механизме генерации кода.Имеет ли смысл сгенерированный код, иногда можно определить, только когда вы действительно попробуете его.

2 голосов
/ 02 июля 2011

Учитывая шаблон класса TempFoo ниже, вы видите, что он вызывает функцию example шаблонного типа T в своем конструкторе. Первые два типа работают, потому что они оба определяют example; третий нет.

template<typename T>
class TempFoo
{
    void TempFoo() {
        T obj;
        obj.example();
    }
};

class First {
    void example() {}
};

class Second {
    void example() {}
};

class Third {
};

int main()
{
     TempFoo<First> f; // works
     TempFoo<Second> s; // works
     TempFoo<Third> t; // doesn't

}
1 голос
/ 02 июля 2011

Что бы вы ни указали в списке параметров tempalte, это просто заполнитель.Компилятор ответит соответствующими типами в соответствии с типом объекта, который используется для создания экземпляра класса шаблона.Ошибка времени компиляции будет появляться, если объект не насыщает операции, выполняемые в функциях.Также рекомендуется использовать 'T' в качестве заполнителя.

0 голосов
/ 02 июля 2011

Простой способ убедиться, что параметр шаблона является производным от базового класса:

template<typename BarType>
class Foo 
{
    // ...
    ~Foo() { Bar* p = (BarType*)0; }
};

Компилятор проверит тип назначения, генерируя ошибку, если Bar не является однозначным супертипом BarType, а затем оптимизирует неиспользуемую локальную переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...