存储各种 void 函数指针及其参数的向量

Posted

技术标签:

【中文标题】存储各种 void 函数指针及其参数的向量【英文标题】:Storing a vector of various void function pointers with its parameters 【发布时间】:2015-01-11 00:02:36 【问题描述】:

我正在寻找一种方法来将函数指针存储在像向量这样的容器中。如果所有函数都具有相同的参数,这是可能的,但如果函数具有单独唯一的参数,我可以这样做吗?

#include <iostream>
#include <vector>

using namespace std;

void sayHi() 
    cout << "Hi" << endl;


void sayNum(int num) 
    cout << num << endl;


int main() 
    vector<void(*)()> funcs; // vector of 0 argument functions
    funcs.push_back(sayHi);
    funcs.push_back(sayNum); // can't store sayNum because it takes arguments

请注意,我不能使用 std::function 或 std::bind 因为 VS2013 没有它们,我宁愿不使用 boost 库。解决方案必须允许遍历函数指针向量并使用一些有效参数执行每个指针。

请原谅我对函数指针如何工作的潜在无知,我非常习惯在一个语句中用 javascript 做这种事情:P

【问题讨论】:

你会怎么用这个东西? 那么一个有效的答案应该是简约的function 实现? VS2013 同时拥有std::functionstd::bind @Columbo 即使std::function 带有不同的参数,您如何使用? AFAIK,每个std::function 都有不同的类型,所以你需要某种boost::any 方法。 @vsoftco Erm,是的。 any,过失。 【参考方案1】:

犯了不包括的错误,因为我在任何人的代码示例中都看不到它,但可能只是我不擅长 C++。

不打算接受我自己的答案,但我认为我会发布我的代码只是为了任何可能会觉得有用的人的利益。

#include <iostream>
#include <vector>
#include <functional>

using namespace std;

typedef std::vector<std::function<void(void)>> f_list;
f_list f1;

void _sayHi();
void _sayNum(int num);

void sayHi() 
    f1.push_back(
        std::bind(&_sayHi)
    );


void sayNum(int num) 
    f1.push_back(
        std::bind(&_sayNum, num)
    );


void _sayHi() 
    cout << "hi" << endl;

void _sayNum(int num) 
    cout << num << endl;


int main() 
    sayHi();
    sayNum(5);

    for (int i = 0; i < f1.size(); i++) 
        f1.at(i)();  // will execute desired functions
    

【讨论】:

你为什么在_sayHi上使用std::bind?它已经有正确的签名,你可以直接将它添加到向量中。【参考方案2】:

VS 2103 有 std::functionstd::bind 和 lambda。只需使用它们。

【讨论】:

完全是我的错,我没有包括 。只是一个菜鸟的错误。

以上是关于存储各种 void 函数指针及其参数的向量的主要内容,如果未能解决你的问题,请参考以下文章

函数参数传递指针变量

如何在类向量中存储/使用外部函数指针

显式 void 指针作为函数参数

在函数中使用向量指针时出错

如何将向量传递给函数参数(我需要指针吗?)

简述static关键字void与void *(void指针)函数指针