2015-07-30 4 views
2
// (1) 
template<typename T> 
T add1(T a, T b) 
{ 
    return a + b; 
} 

// (2) 
auto add2 = [](auto a, auto b) 
{ 
    return a + b; 
}; 

лямбды В этом простом примере я задавался вопрос, реализация лучше с точкой зрения:Различие между шаблоном функции и выражением

  • размера коды (в старые времена шаблонов, используемых, чтобы вызвать «разрастание коды»)
  • скорость выполнения (есть ли разница для нетривиальной тела функции?)
  • встраивание дружественность (который вариант более вероятно, чтобы быть встраиваемыми в случае нетривиальной тела функции?)
+0

предпочитаю поздняя версия. О размере кода вы можете улучшить профиль и проверить себя. –

+0

все зависит от этого, примерно то же самое. –

+3

'(1)' и '(2)' не делают то же самое. 'add1 (1, 3.14)' fail, тогда как 'add2 (1, 3.14)' успешно. '(3)' будет что-то вроде 'template auto add3 (A a, B b) -> decltype (a + b) {return a + b;}'. C++ 14 позволяет вам уйти без '-> decltype()' -part. – nwp

ответ

5

Так напомним, что общий лямбда в основном определяет шаблон функции operator(), поэтому вторая версия в основном:

struct __some_uniq_name 
{ 
    template<typename T, typename U> 
    auto operator()(T a, U b) const 
    { 
     return a + b; 
    } 
} add2; 

код здесь такой же, как код в add1 *, за исключением того, одна функция состоит в локальная переменная, а другая - шаблон свободной функции. Не должно быть никакой разницы в производительности, размере кода или возможности наложения (но всегда, тестовый тестовый тест!) - единственная разница в том, какой из них вы можете использовать где. Нужно ли добавлять вещи во многих местах? Используйте add1. Нужно использовать его в одном конкретном месте? Используйте add2.

* кроме того, что он позволяет добавлять объекты разных типов, поэтому, если вам нужно это сделать, у вас есть только один вариант.

Смежные вопросы