如何将函数存储到变量?

时间:2011-04-07 14:40:02

标签: c++ function-pointers

我认为它们被称为仿函数? (已经有一段时间了)

基本上,我想在变量中存储一个指向函数的指针,所以我可以从命令行指定我想要使用的函数。

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

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

function_pointer = either of the above?

所以我可以通过以下方式调用它:function_pointer(my_variable)?

编辑: 根据@ larsmans的建议,我得到了这个: 的config.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

8 个答案:

答案 0 :(得分:17)

你能做的最简单的是

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

这是一个裸函数指针,它不能用于指向除自由函数之外的任何东西。

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

auto pFunc = func_1;

在任何情况下,您都可以使用

调用该函数
unsigned int result = pFunc(100);

还有许多其他选项可以提供一般性,例如:

  • 您可以将boost::function与任何C ++编译器一起使用
  • 使用编译器实现C ++ 0x的功能,您可以使用std::function

这些可用于指向可以使用适当的签名调用的任何实体(它实际上是实现operator()的对象,称为仿函数)。

更新(以解决更新的问题)

您当前的问题是您尝试使用Config::current_hash_function(您宣布正常)但未能定义它。

这定义了一个函数的全局静态指针,与class Config中的任何内容无关:

unsigned static int (*current_hash_function)(unsigned int) = kennys_hash_16;

这就是你需要的:

unsigned int (*Config::current_hash_function)(unsigned int) = kennys_hash_16;

答案 1 :(得分:5)

不,这些被称为函数指针。

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

答案 2 :(得分:5)

你也可以使用c ++ 0x或boost中的函数。 那将是

boost::function<int(int)>

然后使用bind将您的函数绑定到此类型。

查看herehere

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

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);
}

答案 3 :(得分:3)

typedef unsigned int (*PGNSI)(unsigned int);

PGNSI variable1 = func_1;
PGNSI variable2 = func_2;

答案 4 :(得分:2)

在C ++ 11中,您可以使用std::function来存储函数。要存储功能,可以将其用作follsonig:

  

std :: function << em>返回类型((参数类型)>

作为示例,它是:

#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);
}

答案 5 :(得分:1)

unsigned int (* myFuncPointer)(unsigned int) = &func_1;

但是,函数指针的语法很糟糕,因此它们typedef很常见:

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

答案 6 :(得分:1)

你可以通过这种方式在 C++ 中将函数存储在变量中

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


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

答案 7 :(得分:0)

如果您安装了Boost,还可以查看Boost Function