如何在C ++中将变量用作函数?

时间:2012-01-09 04:19:22

标签: c++ function variables

在某些语言中(我想到了PHP和JavaScript),我可以将变量用作函数。例如:

PHP: Class::$var_function();

在C ++中是否可以以不需要switch或if语句的方式进行此操作?

4 个答案:

答案 0 :(得分:4)

是。这样的变量称为函数指针(用于非成员或静态成员函数)或指向成员函数的指针(用于非静态成员函数)。

或者,Boost,C ++ TR1和C ++ 11都提供a polymorphic function wrapper,它基本上是一种超级灵活的通用函数指针类型。

答案 1 :(得分:4)

这是指向函数的指针。

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.但是它清楚地表明正在使用指向函数的指针(所以我仍然喜欢它并经常使用它)。

答案 2 :(得分:4)

詹姆斯的回答可能是最好的。但是,如果您使用的是兼容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;
}

答案 3 :(得分:0)

除了其他答案之外,您还可以通过定义函数调用运算符,使任何用户定义类型的对象充当函数(甚至像一组重载函数):

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
}