Есть ли способ доставить некоторые функции или операторы в качестве параметров? - PullRequest
2 голосов
/ 18 марта 2011

Есть ли способ перенести некоторое функциональное программирование на C ++, я хочу доставить некоторые функции или операторы LAMBDA в качестве параметра для другой функции.

, например:

void test(DWORD foo)
{ 
  try { __asm { call foo; } }  // very weird way, don't think that could work
  catch (...) { () } 
}

или:

void test2(DWORD foo)
{ 
  someconnection.Open();
   __asm { call foo; }  // very weird way, don't think that could work
  someconnection.Close();
}

и их использование:

int main ()
{
  ...
  dosomething();
  ...
  void operator()(int n) // lambda expression, not sure if that correct way creating them
  {
     dosomething();
     dosomethingelse();
  }
  test ( *operator(5) ) // here is what I want
  test2 ( *operator(10) ) // here is what I want
  ...
  dosomethingelse();
  ...
}

Я использую Visual Studio 2010 и не уверен, что смогу использовать там C ++ 0x, но могу ли я использовать boost, если это может сделать то, чтоЯ хочу сделать.

Так есть ли способы сделать это?

Ответы [ 3 ]

6 голосов
/ 18 марта 2011

Вы можете, сделав параметр, например, test a std::tr1::function:

void test(std::tr1::function<void(DWORD)> func) {
    func(0);
}

Вы можете вызвать это с помощью функции, функции-члена или даже лямбды:

test([](DWORD param) { return; });
1 голос
/ 18 марта 2011

Просмотр функциональных объектов (функторов): http://en.wikipedia.org/wiki/Function_object
и лямбда в бусте: http://www.boost.org/doc/libs/1_46_0/doc/html/lambda.html

0 голосов
/ 18 марта 2011

Для этого есть тонна вещей .

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

Ну, на самом деле сообщения читаются в некотором смысле, но только если вы очень хорошо знакомы с реализацией всех задействованных объектов Boost.ИМХО клиенту учреждения не нужно знать так много о внутреннем устройстве того, как средство кодируется для его использования.

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