Возможный иметь анонимные функции C++ с повышением?

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

То, что я хотел бы сделать, (по существу)

template<typename T>
T DoSomething(T one, function<T(T)> dosomething)
{
    return one + dosomething(5);
}

void GetMyVal(...)
{
   DoSomething<int>(1, /*anonymous func here*/)
}

Этот пример очень, очень упрощен для того, что я должен сделать. В C# я сделал бы p => p*5. Я знаю, что это легко с C++ 0x, но я не могу использовать это. Я чувствую, что должен смочь сделать это с любым повышением:: лямбда или compination повышения:: свяжите и повысьте:: функция с заполнителями, но я, может казаться, не заставляю это работать. Это не может быть возможно, и это прекрасно также, но ответьте если не возможный.Спасибо.

Править: Хорошо, кажется, что простой случай интервала хорошо работает, что относительно более сложной структуры? Так, позволяет попытке

struct NumHolder
{
  int x;
}

template<typename T>
T DoSomething(T one, function<T(NumHolder)> dosomething)
{
    NumHolder temp;
    temp = 5
    return one + dosomething(temp);
}

void GetMyVal(...)
{
   DoSomething<int>(1, /*anonymous func here*/)
}

Здесь мое выражение C# было бы вроде p => p.temp * 5. Действительно ли это возможно сделать в C++ с повышением?

РЕДАКТИРОВАНИЕ 2: хорошо, теперь мне просто любопытно :D Как я вызвал бы функцию в лямбда-выражении? Так, если мы имеем

int ChangeVal(int mult)
{
    return mult*5;
}

struct NumHolder
{
  int x;
}

template<typename T>
T DoSomething(T one, function<T(NumHolder)> dosomething)
{
    NumHolder temp;
    temp = 5
    return one + dosomething(temp);
}

void GetMyVal(...)
{
   DoSomething<int>(1, /*anonymous func here*/)
}

В C# я мог назвать p => ChangeVal (p). Чем синтаксис был бы для этого с лямбда-выражениями C++?

6
задан Steve 5 April 2010 в 20:14
поделиться

3 ответа

Как отмечает Андерс в своем ответе, boost :: lambda может быть полезен, но в некоторых случаях код может стать трудночитаемым. Таким образом, это зависит от того, что вы хотите делать в своей анонимной функции.

Для простого случая, такого как p => p * 5 , который вы упомянули в своем вопросе, мне кажется, что использование Lambda или Bind было бы разумным, хотя:

DoSomething(1, _1 * 5);

Изменить: {{1} } Ваш второй пример касается одной области, где синтаксис быстро становится подробным: доступ к членам (данным или функциям). Поскольку оператор «точка» не может быть перегружен в C ++, вы должны использовать выражение привязки, чтобы получить «x» из аргумента:

DoSomething(1, bind(&NumHolder::x, _1) * 5);

или, с Boost.Lambda, использовать перегруженный оператор -> *:

DoSomething(1, &_1->* &NumHolder::x * 5);

Редактировать 2: Хорошо, в последний раз :) В своем последнем вопросе вы пишете, что на C # вы должны написать p => ChangeVal (p) , но в приведенном выше коде показано, что ChangeVal принимает int, а не NumHolder, поэтому непонятно, что вы имеете в виду.

Предполагая, что ChangeVal принимает int и вы хотите, чтобы анонимная функция выполняла эквивалент ChangeVal (the_arg.x) , вы должны написать это с помощью Boost.Lambda:

DoSomething(1, bind(&ChangeVal, &_1->*&NumHolder::x));

или это с помощью Boost.Bind (также работает с Lambda):

DoSomething(1, bind(&ChangeVal, bind(&NumHolder::x, _1));
5
ответ дан 17 December 2019 в 00:06
поделиться

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

Я думаю, что эквивалентом для C# p=>p*5 будет _1*5, но я смотрел на это только мельком, поэтому не уверен. Для простых вещей это работает, но как только вам понадобятся управляющие структуры, вам придется использовать другой набор управляющих структур, которые основаны на функциональности, а не на императиве. Я нашел это настолько отличным от нормального кода на C++, что решил для себя, что не стоит его использовать, потому что это делает код настолько трудным для чтения другими.

2
ответ дан 17 December 2019 в 00:06
поделиться

boost не расширяет синтаксис C ++. в C ++ нет анонимных функций.

0
ответ дан 17 December 2019 в 00:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: