Способ передачи аргумента в шаблонную функцию - PullRequest
1 голос
/ 09 апреля 2019

Предположим, у меня есть шаблонная функция

template <typename T>
void do_sth(T const&);

Для некоторых типов («маленьких» и копируемых) было бы лучше передать аргумент по значению вместо ссылки.

ТакМой вопрос: как проще всего перегрузить функцию в зависимости от базового типа?

Примечание: Лучшее, что я получил, это использование enable_if с некоторыми условиями «простого» типа.И я считаю, что в стандартной библиотеке нет такой черты типа, как «простой тип».Поправьте меня если я ошибаюсь.Более того: использование enable_if усложняется, поскольку функция принимает больше аргументов шаблона ( отредактировано ), потому что template <typename T, typename U> void do_sth(T, U) потребуется 4 перегрузки: (значение, значение), (значение, ссылка), (ссылка, значение)и (ref, ref).

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

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

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

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

1 голос
/ 09 апреля 2019

boost имеет call_traits :

template <typename T>
void do_sth(typename boost::call_traits<T>::param_type)

Но одна большая проблема заключается в том, что T больше не вычитается
(и поэтому вы должны назвать его do_sth<int>(42) илиdo_sth<MyBigObj>(myBigObj)).

Так что может использоваться для не шаблонных методов в шаблонном классе:

template <typename T>
struct S
{
    void do_sth(typename boost::call_traits<T>::param_type);
};

Но в любом случае, есть вероятность, что компилятор на самом деле встроит код, что приведет к тому же сгенерированному коду.

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