Шаблоны C ++: запрос о том, какой из способов лучше использовать и почему - PullRequest
2 голосов
/ 07 октября 2010

У меня есть вопрос.Что лучше делать?

typedef enum{
  One = 1,
  Two = 2
} Number;

template< typename T, Number num >
void foo( const T& param )
{
}

or 

template< typename T >
void foo( const T& param, Number num )
{
}

Что я в основном ищу, так это то, чем эти два метода отличаются?Если я должен использовать какой-либо из них, какой из них я должен выбрать и почему?

Ответы [ 3 ]

10 голосов
/ 07 октября 2010

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

Каков ваш вариант использования?

4 голосов
/ 07 октября 2010

Вот проблема с чистотой кода, о которой вы захотите знать.Скажем, пользователь вводит опцию.Итак, у вас есть некоторая переменная Number x, которая может быть One или Two.Если вы хотите позвонить foo(), вам нужно будет сделать ...

if (x == One)
    foo<const char *, One>("asd");
else
    foo<const char *, Two>("asd");

, где, как если бы вы использовали альтернативный способ (ваше предложение номер два), вы могли бы просто сделать:

foo<const char *>("asd", x);

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


Кроме того, чем эти методы отличаются.В коде, который я написал выше, я ссылался на три разные функции.В последнем, где есть только один параметр шаблона, код, сгенерированный для этой функции, будет включать оба пути кода, когда num == One и когда num == Two.Однако первые два шаблонных метода смогут удалить эти ветви.Он может сделать это, потому что он построит два разных пути кода в памяти, по одному для каждого случая.

2 голосов
/ 07 октября 2010

Я бы пошел на секунду, если foo() не является критически важным для производительности, так как я думаю, что это яснее.

Что касается различий:

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

Вторая будет иметь разные версии только для разных T и будет выбирать разные num во время выполнения.

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

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