【问题标题】:How to use variables as functions in C++?如何在 C++ 中将变量用作函数?
【发布时间】:2023-03-12 04:00:01
【问题描述】:

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

PHP: Class::$var_function();

是否可以在 C++ 中以不需要 switch 或 if 语句的方式实现这一点?

【问题讨论】:

  • 必须指出,上面的PHP sn-p 没有使用变量作为函数。它使用变量为方法调用动态创建标识符(“变量变量”的一种形式)。在下面的 C/C++ 代码中,使用了函数的实际“句柄”(函数指针或 std::function)并且标识符本身是稳定的。cmets 只能编辑 5 分钟(单击此框可关闭)
  • (在 JavaScript 的情况下,它在这方面与 PHP 非常不同,函数是适当的一等值并且表现得与任何其他对象值一样:对象就是它自己。)

标签: c++ function variables


【解决方案1】:

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

【讨论】:

  • 我在 typedef 声明中收到此编译器错误:错误:'
  • 你用的是什么编译器?如果是 g++,则传递 -std=c++0x 给它。
  • cc1plus: error: unrecognized command line option "-std=c++0x" 是的,我使用的是 g++ (Mac OS X)
  • 你需要使用最近的版本,我认为 >4.5。另一个替代方法是使用上面提到的 James 的 boost。我会更新我的帖子以添加增强版
  • 我不确定这是否仍然是一个问题,但A a(); 没有声明一个返回不带参数的类A 的本地函数吗?我想你只想要A a;
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这是指向函数的指针允许你做的事情。

    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】:

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

      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
      }
      

      【讨论】:

        猜你喜欢
        • 2018-11-26
        • 1970-01-01
        • 2017-01-13
        • 2013-12-23
        • 1970-01-01
        • 2021-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多