C ++ шаблон программирования структура против шаблона - PullRequest
2 голосов
/ 17 апреля 2011

Чтобы обеспечить функциональность для класса cls, скажем, 'add', я решил следующие типы:

struct add
{
      add sum(add other) { ... }
};

против

template<typename Add>
Add sum(Add one, Add two) { ... }

Какой подход должен быть предпочтительным, какие преимущества имеет первый по сравнению со вторым и наоборот?

Ответы [ 4 ]

3 голосов
/ 17 апреля 2011

Какой подход должен быть предпочтительным, какие преимущества имеет первый по сравнению со вторым и наоборот?

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

См. Также О напряженности между объектно-ориентированным и общим программированием в C ++ .

2 голосов
/ 17 апреля 2011

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

Для честного сравнения вы должны сравнить:

add sum(add one, add two) { ... }

и:

template<typename Add>
Add sum(Add one, Add two) { ... }

Хотя второй вариант может быть более полезным, это зависит от того, как вы собираетесь написать тело функции.Может ли он быть написан универсальным образом и все же выполнять операции над add объектами?

0 голосов
/ 17 апреля 2011

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

Еслитипы исправляются во время выполнения, вы можете использовать шаблон с некоторыми приемами, чтобы не указывать, какие типы вы используете, и компилятор находит их и генерирует правильный код.

Обратите внимание, однако, что C ++ не допускает частичной специализации на шаблонефункции, только для шаблонных классов, поэтому для максимальной гибкости вам может понадобиться обернуть ваши функциональные возможности как методы шаблонных структур (даже статические методы в порядке).Как только у вас будет механизм диспетчеризации классов шаблонов, вы можете добавить функции шаблонов, чтобы разрешить вывод типов и упростить синтаксис.

0 голосов
/ 17 апреля 2011

Во-первых, это не имеет смысла для меня, или это настолько плохо, что это не должно иметь смысла, потому что вы пишете класс просто для того, чтобы выполнить какую-то «операцию».Предполагается, что класс представляет объект в объектно-ориентированном программировании (или, если его шаблон класса, он может выступать в качестве мета-функции в шаблоне meta-programmig).

Для работы имеют смысл функции, которые работают с объектом(ы).Так что второй имеет смысл, но я бы изменил имя аргумента типа на:

template<typename T>
T sum(const T & one, const T & two) { ... }

В конце концов, что было Add?

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