C++ 如何将函数存储到变量?

C++ 如何将函数存储到变量?,c++,function-pointers,C++,Function Pointers,我想他们叫函子?(已经有一段时间了) 基本上,我希望将指向函数的指针存储在变量中,以便可以从命令行指定要使用的函数 所有函数返回并采用相同的值 unsigned int func_1 (unsigned int var1) unsigned int func_2 (unsigned int var1) function_pointer = either of the above? 这样我就可以调用它了:function\u pointer(我的变量)? 编辑: 根据@larsmans的建议,

我想他们叫函子?(已经有一段时间了)

基本上,我希望将指向函数的指针存储在变量中,以便可以从命令行指定要使用的函数

所有函数返回并采用相同的值

unsigned int func_1 (unsigned int var1)
unsigned int func_2 (unsigned int var1)

function_pointer = either of the above?
这样我就可以调用它了:
function\u pointer(我的变量)?

编辑: 根据@larsmans的建议,我得到了: 配置h:

class Config
{
public:
    unsigned static int (*current_hash_function)(unsigned int);
};
Config.cpp:

#include "Config.h"
#include "hashes.h"
unsigned static int (*current_hash_function)(unsigned int) = kennys_hash_16;
hashes.h:

unsigned int kennys_hash(unsigned int out);
unsigned int kennys_hash_16(unsigned int out);
hashes.cpp:

just implements the functions in the header
main.cpp:

#include "Config.h"
#include "hashes.h"
// in test_network:
    unsigned int hashed = Config::current_hash_function(output_binary);

//in main():
        else if (strcmp(argv[i], "-kennys_hash_16") == 0)
        {
            Config::current_hash_function = kennys_hash_16;
        }
        else if (strcmp(argv[i], "-kennys_hash_8") == 0)
        {
            Config::current_hash_function = kennys_hash;
        }
我得到的错误是:

g++ -o hPif src/main.o src/fann_utils.o src/hashes.o src/Config.o -lfann -L/usr/local/lib 
Undefined symbols:
  "Config::current_hash_function", referenced from:
      test_network()     in main.o // the place in the code I've selected to show
      auto_test_network_with_random_data(unsigned int, unsigned int, unsigned int)in main.o
      generate_data(unsigned int, unsigned int, unsigned int)in main.o
      _main in main.o // the place in the code I've selected to show
      _main in main.o // the place in the code I've selected to show
      generate_train_file()     in fann_utils.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [hPif] Error 1

不,这些称为函数指针

unsigned int (*fp)(unsigned int) = func_1;

你能做的最简单的事情就是

unsigned int (*pFunc)(unsigned int) = func_1;
这是一个裸函数指针,不能用于指向自由函数以外的任何对象

如果您的编译器支持C++0x
auto
关键字,则可以减少痛苦:

auto pFunc = func_1;
在任何情况下,都可以使用

unsigned int result = pFunc(100);
提供通用性的还有许多其他选项,例如:

  • 可以使用<代码> Boo::函数< /COD>任何C++编译器
  • 通过实现C++0x特性的编译器,您可以使用
    std::function
这些可以用来指向任何可以用适当签名调用的实体(实际上是实现称为functor的
操作符()
的对象)

更新(解决更新的问题) 您眼前的问题是,您试图使用
Config::current\u hash\u函数(您声明该函数很好),但未能定义它

这定义了指向函数的全局静态指针,与
类配置中的任何内容无关:

unsigned static int (*current_hash_function)(unsigned int) = kennys_hash_16;
这正是您需要的:

unsigned int (*Config::current_hash_function)(unsigned int) = kennys_hash_16;
但是,函数指针的语法很糟糕,因此
typedef
它们很常见:

typedef unsigned int (* myFuncPointerType)(unsigned int);
myFuncPointerType fp = &func_1;

如果已经安装,您也可以签出。

您还可以使用c++0x或boost中的函数。 那就是

boost::function<int(int)>
boost::函数
然后使用bind将函数绑定到此类型

看一看,然后

好的,这里是一个例子。我希望这有帮助

int MyFunc1(int i)
{
    std::cout << "MyFunc1: " << i << std::endl;
    return i;
}

int MyFunc2(int i)
{
    std::cout << "MyFunc2: " << i << std::endl;
    return i;
}

int main(int /*argc*/, char** /*argv*/)
{
    typedef boost::function<int(int)> Function_t;

    Function_t myFunc1 = boost::bind(&MyFunc1, _1);
    Function_t myFunc2 = boost::bind(&MyFunc2, _1);

    myFunc1(5);
    myFunc2(6);
}
int MyFunc1(int i)
{

std::cout在C++11中,您可以使用
std::function
来存储函数。要存储函数,您可以使用它如下所示:

std::函数

例如:

#include <functional>
#include <iostream>

int fact (int a) {
    return a > 1 ? fact (a - 1) * n : 1;
}

int pow (int b, int p) {
    return p > 1 ? pow (b, p - 1) * b : b;
}

int main (void) {
    std::function<int(int)> factorial = fact;
    std::function<int(int, int)> power = pow;

    // usage
    factorial (5);
    power (2, 5);
}
#包括
#包括
int事实(INTA){
返回a>1?事实(a-1)*n:1;
}
内部功率(内部b,内部p){
返回p>1?功率(b,p-1)*b:b;
}
内部主(空){
函数阶乘=事实;
标准:功能功率=功率;
//用法
阶乘(5);
功率(2,5);
}

<代码> > p>您可以以C++的方式在一个变量中存储函数

auto function_name = [&](params){
    statements 
};


auto add = [&](int a,int b){
    return a+b;
};
cout<<add(5,6);
auto function_name=[&](参数){
声明
};
自动添加=[&](整数a,整数b){
返回a+b;
};

coutNote:您要将其称为
(*fp)(my_变量)
,而不是文章中描述的方式。@Michael:您可以使用
fp(arg)调用
因为函数指针是一个普通函数。试试看。我想我真的很接近……但是,我没有找到符号。我将函数指针存储在另一个类中……我将添加一些代码。@DerNalia:这是因为您将函数指针声明为一个实例变量,而不是静态成员,所以无法将其设置为打开如果您希望它是类范围的设置,对于语法健全,我将Type函数指针类型,然后用它的Type表示它的类型,创建一个静态成员。Type Debug的意思是什么?(如果你不能告诉^ ^),我是C++的新手。在c++0x中,人们可以使用
auto
;-)如何将函数分配给pFunc,以及如何调用pFunc?@DerNalia:有关于如何分配和如何调用函数的代码。因此,那么..我想我的错误与我当时如何使用类有关。我会将此标记为答案,并投票给你。如果你能帮助我解决分类问题,那就好了太棒了。这有点让人困惑了…如果我有一个名为“my_function”的函数,我如何将它分配给一个变量,这样我就可以通过执行“function_pointer(variable)”来调用它?我理解你的代码,但你能告诉我typedef boost:function-function-function不工作或如何使用吗?这有点让人困惑了…如果我有一个名为“我的函数”,如何将其分配给变量,以便通过执行“函数指针(变量)”调用它"谢谢。=\Boost函数链接中给出的示例你看到了吗?例如,在你的例子中,函数取一个
无符号int
并返回一个
无符号int
。如果你使用Boost函数,那么你必须声明
Boost::function1f;
。这意味着你在声明一个函数对象
f
ch返回一个
unsigned int
(第一个模板参数),并接受一个
unsigned int
作为参数(第二个模板参数)
然后将函数对象声明为
boost::function2f
。上面的注释是关于如何声明函数对象的。然后在要使用它的代码中,只需执行,
f=&your_function;
。然后在调用站点调用
f(3)
。请参阅Boost函数教程。这一点非常简单。@NullVoxPopuli:答案并不是无效的,因为按照本文中的语法理解起来很混乱。我不明白我可以在变量1和变量2存储其他函数的地方使用指针类吗?为什么main有
void
,并且不返回任何内容?(否则答案很好)在C语言中,如果你有main(),它会接受你想要的任意多的参数,并且在某些情况下,它会在程序运行期间保留这些参数。void保证main它会自动放弃你给它的所有参数。这是一个好的解释。
#include <functional>
#include <iostream>

int fact (int a) {
    return a > 1 ? fact (a - 1) * n : 1;
}

int pow (int b, int p) {
    return p > 1 ? pow (b, p - 1) * b : b;
}

int main (void) {
    std::function<int(int)> factorial = fact;
    std::function<int(int, int)> power = pow;

    // usage
    factorial (5);
    power (2, 5);
}
auto function_name = [&](params){
    statements 
};


auto add = [&](int a,int b){
    return a+b;
};
cout<<add(5,6);