Используйте шаблоны в качестве участников, когда не все детали известны - PullRequest
0 голосов
/ 27 декабря 2010

Можно ли указать шаблон в качестве участника, но не знать все детали? Или, скорее, как я могу обойти это.

Пример не работает, но может показать вам, чего я пытаюсь достичь.

template<typename T>
struct Foo {
   ///blah...
};

struct Bar {
    Foo* m_foo;
};

Bar в данном случае является базовым классом, и в зависимости от производных классов я не буду знать полную информацию о Foo

Ответы [ 2 ]

5 голосов
/ 27 декабря 2010

Вы также можете сделать Bar классом шаблона, чтобы он мог передавать этот аргумент шаблона в Foo, или же вы можете сделать все варианты Foo<T> наследуемыми от общего интерфейса (в C ++, интерфейсаэто просто абстрактный класс без реализации, все члены являются чисто виртуальными функциями), и тогда Bar может указывать на этот интерфейс.

Первый способ лучше, если Bar просто собирается предоставить некоторую функциональность, котораябудет повторно использоваться группой производных классов.

Второй способ лучше, если потомки Bar будут использоваться полиморфно.

0 голосов
/ 27 декабря 2010

Приведенный выше код не будет работать, поскольку всякий раз, когда вы используете шаблон C ++, вы должны указать его аргументы.Если вы хотите сохранить Foo неизвестного типа, вы можете сделать это путем параметризации Bar по какому-либо типу (например, сделать его шаблоном с аргументом типа T), а затем с помощью Bar сохранить Foo.Это отличается от других языков, таких как Java, где код, подобный тому, что вы изложили выше, является законным, потому что шаблоны работают по-разному в C ++.В частности, генетика в стиле Java просто компилируется в одно конкретное представление, а затем использует проверки во время выполнения, чтобы убедиться, что они используются правильно.Все экземпляры шаблонов C ++ в конечном итоге компилируются в отдельный код, и поэтому компилятор должен иметь возможность выводить во время компиляции, что такое типы аргументов (поэтому он знает, какой код генерировать).

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