C ++ частичная специализация шаблонов - PullRequest
1 голос
/ 27 октября 2011

этот ответ считается "хорошим" кодом или это просто уродливый взлом?

И я хотел бы знать, как это объявлено заранее (оба класса).

Когда я просто объявляю класс с двумя параметрами шаблона, он всегда принимает этот параметр, независимо от значения flag.

Я хотел бы сделать это, потому что у меня есть 2специальные функции-члены, которые должны вести себя по-разному, если flag истинно, и я не хочу переопределять весь класс.Также оно должно иметь то же имя.Согласно этому примеру, это кажется возможным.

И я должен объявить это вперед, потому что я создаю библиотеку, в которой мы все декларируем вперед.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 27 октября 2011

У него есть недостаток в том, что он на самом деле не работает. Базовая функция-член не переопределяется, но она просто скрыта функцией производного класса, когда вы пытаетесь вызвать ее извне. Это означает, что если вы вызываете doSomething из базового класса (где, по-видимому, живут все ваши другие функции), он будет вызывать базовый класс doSomething, который не является тем, что требуется.

Принятый ответ на этот вопрос показывает несколько способов решения вашей проблемы.

1 голос
/ 27 октября 2011

Чтобы использовать специализацию, ее определение всегда должно быть видно вызывающей стороне.Если, например, у вас есть template <class Type, bool flag> struct something, определенный в одном заголовке, и template <class Type> struct something<Type, true> : public something<Type, false>, определенный во втором, для использования последнего вам необходимо включить второй заголовок .Без этого вы всегда получите первый, более общий тип.

РЕДАКТИРОВАТЬ: бит о декларировании вперед заставил меня задуматься.Если вы хотите использовать только объявление типа, как в переменной указателя, сделайте следующее:

Заголовок

template <class Type, bool flag>
struct something;

struct Test
{
    something<int, true>* ptr; // definition not needed
    Test();
}

Источник

#include "something.h" // header with template
#include "something_spec.h" // header with specialisation

Test::Test()
{
    ptr = new something<int, true>(); // specialisation used
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...