Как использовать переменные в качестве функций в C ++? - PullRequest
3 голосов
/ 09 января 2012

В некоторых языках (на ум приходят PHP и JavaScript) я могу использовать переменную как функцию.Например:

PHP: Class::$var_function();

Возможно ли это в C ++ способом, который не требует переключения или оператора if?

Ответы [ 4 ]

4 голосов
/ 09 января 2012

Это то, что позволяют делать указатели на функции.

int max(int v1, int v2) { return (v1 > v2) ? v1 : v2; }
int min(int v1, int v2) { return (v1 < v2) ? v1 : v2; }
int add(int v1, int v2) { return v1 + v2; }
int (*function)(int, int) = add;

int x = function(1, 3);  // x == 4
function = min;
int y = function(1, 3);  // x == 1

И т. Д.

Вы также можете получить указатели на функции-члены в C ++;нотация несколько иная.

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

function = max;
int z = (*function)(1, 3);  // x == 3

Это старомодный, предстандартный C. Но это ясно дает понятьчто используется указатель на функцию (так что я все еще люблю его и часто его использую).

4 голосов
/ 09 января 2012

Джеймс ответ, вероятно, лучший. Но если вы используете компилятор, совместимый с c ++ 11, вы можете поочередно использовать std :: function

Например:

#include <functional>
#include <iostream>
typedef std::function<void(int a)> callback_t;

class A {
public:
   void fn(int a) { std::cout << a << std::endl; }
};

void fn2(int b) { std::cout << a << std::endl; }

int main() {
   A a;
   callback_t c = std::bind(&A::fn, a, std::placeholders::_1);
   c(1);

   c = fn2;
   c(2);

   return 0;
}

И буст-версия (я никогда этим не пользовался, поэтому она может быть неправильной):

#include <boost/function.hpp>
#include <iostream>
typedef boost::function<void(int a)> callback_t;

class A {
public:
   void fn(int a) { std::cout << a << std::endl; }
};

void fn2(int b) { std::cout << a << std::endl; }

int main() {
   A a;
   callback_t c = boost::bind(&A::fn, a, boost::placeholders::_1);
   c(1);

   c = fn2;
   c(2);

   return 0;
}
4 голосов
/ 09 января 2012

Да. Такая переменная называется указателем на функцию (для не членов или статических функций-членов) или указателем на функцию-член (для нестатических функций-членов).

В качестве альтернативы, Boost, C ++ TR1 и C ++ 11 предоставляют полиморфную function оболочку , которая в основном является универсальным универсальным типом указателя универсальной функции.

0 голосов
/ 09 января 2012

В дополнение к другим ответам, вы можете заставить объекты любого пользовательского типа действовать как функции (или даже как набор перегруженных функций), определяя оператор вызова функции:

class MyClass
{
public:
  MyClass(): member(42) {};
  void operator()(int i) { std::cout << (member=i) << '\n'; }
  void operator()() { std::cout << member++ << '\n'; }
private:
  int member;
};

int main()
{
  MyClass foo;

  foo();   // prints 42
  foo();   // prints 43
  foo(23); // prints 23
  foo();   // prints 24
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...