2016-08-12 7 views
1

Если у меня есть шаблон функции, какКак Вы выбираете значение против ссылки на методы шаблона

template<typename T> 
void doSomething(const T arg) {.....} 

тогда я не знаю заранее, если T является простой INT или если это огромная структура. Если это int, то передача по значению имеет смысл, а структура должна передаваться по ссылке.

Как создать функцию шаблона, которая работает разумно с обоими типами аргументов?

+0

Не будет ли ваша функция обязательной 'inline' (поскольку это только заголовок)? В этом случае компилятор может оптимизировать аргументы 'const int &' для 'int'. Вы можете (= должен) проверить, есть ли какой-либо измеримый выигрыш от использования простых значений вместо ссылок 'const'. – Walter

+0

Возможный дубликат [Generic for loop для элементарного и сложного типа] (http://stackoverflow.com/questions/37272094/generic-for-loop-for-elementary-and-complex-type) –

ответ

2

В библиотеке boost::call_traits есть несколько помощников для таких вещей. В частности, call_traits<T>::param_type

Определяет тип, который представляет «лучший» способ передать параметр типа T функции.

Вы можете использовать его так:

template<typename T> 
void doSomething(typename boost::call_traits<T>::param_type arg) {.....} 

Это в основном работает за счет специализации класса для Speacial случаев. Так, например, ваш вопрос int из вопроса (косвенно) специализируется на int (а не int &).

+3

Это, очевидно, полезно для чего-то но для большинства шаблонов, которые люди пишут в повседневной работе, я бы сказал «не потеть». Оптимизатор, вероятно, будет иметь дело с разными способами: 'const int & arg' и' int arg' - учитывая, что шаблоны почти всегда встроены. –

+0

@MartinBonner Это имеет смысл. Кроме того, «корень всего зла» и того. Тем не менее, вопрос был задан. –

+0

@MartinBonner: Как вы пришли к предположению (или, может быть, факту), предложенному «учитывая, что шаблоны в значительной степени всегда встроены»? Это что-то, на что можно положиться? – thokra

1

Ваш вопрос: XY problem. Вы просите решение проблемы, которая возникает только из-за плохого «решения» с другой проблемой. Итак, здесь я решил ответить на вашу первоначальную проблему.

Поскольку ваша функция шаблона почти наверняка должна быть inline, большинство компиляторов оптимизируют вызов функции, а вместе с ней и вашу проблему. Таким образом, на самом деле не имеет значения, что вы используете, но T const&arg является более консервативным.

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