2013-09-18 4 views
0

Я хочу, чтобы вызвать функцию со следующей подписью:Функция объекта возвращения постоянного значения

void foreach(std::list<float>& floats, boost::function<float(float)> action); 

Эта функция перебирает список и изменяет каждый элемент, выполнив new_value = action(old_value). Каков самый короткий способ предоставить такую ​​функцию действия, которая возвращает всегда одно и то же значение поплавка. Я никогда не пробовал сам, но я предполагаю, что C++ 11 лямбды будет делать работу:

foreach(floats, [](float){ return 3.14; }); 

Что ближе альтернатива в C++ 03, предполагая, что я должен назвать свою функцию и не может использовать std::fill ? Есть ли уловка, чтобы избежать фактического объявления регулярной функции?

+5

Почему не просто 'станд :: заливка (floats.begin(), floats.end(), 3,14)'? – Jon

+1

См. Boost.Phoenix, особенно этот [один] (http://www.boost.org/doc/libs/1_54_0/libs/phoenix/doc/html/phoenix/starter_kit/values.html). – dkrikun

+0

@dkrikun, похоже, что мне нужно! Вы хотите опубликовать его в качестве ответа, чтобы я мог его принять? – FireAphis

ответ

0

Отъезд Boost.Phoenix, он реализует values as nullary functions.
Возможно, вам придется выяснить, как использовать его с Boost.Function, если хотите.

Вот пример такого нульарной функции из учебника Phoenix:

template <typename F> 
void print(F f) 
{ 
    cout << f() << endl; 
} 

int 
main() 
{ 
    print(val(3)); 
    print(val("Hello World")); 
    return 0; 
} 
2

Вы можете использовать,

std::fill(floats.begin(), floats.end(), 3.14); 
+0

К сожалению, я действительно должен назвать свою конкретную функцию. – FireAphis

2

Какова Ближайшей альтернативой в C++ 03? Есть ли уловка, чтобы избежать фактического объявления регулярной функции?

Ближайший трюк в C++ 03 является объявить функцию или класс функтора:

float DoThing1(float) 
{ 
    return 3.13; 
} 

struct DoThing2 
{ 
    float operator()(float) 
    { 
    return 3.13; 
    } 
}; 
+0

будет ли какая-либо разница в использовании функтора над функцией в этом случае? –

+0

@ Koushik Единственное отличие в том, что для функтора вам нужно создать объект. Для хорошего компилятора с правильной оптимизацией не было бы разницы –

+0

oh да компиляторы делают это лучше. также временное также может сделать это правильно? –

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