Вопрос о специализации шаблонов и дублировании кода - PullRequest
5 голосов
/ 31 января 2009

Чтобы специализировать шаблон класса, нужно переопределить все функции-члены в базовом базовом шаблоне (то есть шаблоне неспециализированного класса), даже если ожидается, что они останутся в основном неизменными. Каковы некоторые из принятых методов и «лучших практик», чтобы избежать такого дублирования кода?

Спасибо.

Ответы [ 2 ]

10 голосов
/ 31 января 2009

Вы можете полностью специализировать члена выборочно:

template<int N>
struct Vector {
    int calculate() { return N; }
};

// put into the .cpp file, or make inline!
template<>
int Vector<3>::calculate() { return -1; }

Вы делаете полную специализацию. Это означает, что вы не можете частично специализировать его:

template<int N, int P>
struct Vector {
    int calculate() { return N; }
};

// WROOONG!
template<int N>
int Vector<N, 3>::calculate() { return -1; }

Если вам это нужно, вы можете использовать enable_if:

template<int N, int P>
struct Vector { 
    int calculate() { return calculate<P>(); }
private:
    // enable for P1 == 3
    template<int P1>
    typename enable_if_c<P1 == P && P1 == 3, int>::type
    calculate() { return -1; }

    // disable for P1 == 3
    template<int P1>
    typename enable_if_c<!(P1 == P && P1 == 3), int>::type
    calculate() { return N; }
};

Альтернативный подход - разделить ваши вещи (общие вещи на базовый класс и специализированные вещи на производный класс), как рекомендует Ник.

Я обычно выбираю второй подход. Но я предпочитаю первый, если мне не нужно частично специализировать функции.

4 голосов
/ 31 января 2009

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

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