存储指向成员函数的指针容器
Storing a container of pointers to member functions
我正在尝试弄清楚如何为不同对象(不同类)编写指向不同成员函数的指针容器,例如(伪代码)
std::vector<std::function<??> > vec;
template<class objectType, class parameter1> // This is just for 1-param funcs
void add_to_vector(objectType& obj, void(objectType::*ptrToFunc)(parameter1)) {
std::function<void(parameter1)> fun = std::bind(ptrToFunc, obj, std::tr1::placeholders::_1);
vec.push_back(fun);
}
现在我只想考虑向我要存储成员函数的所有对象添加一个基类,但是无论如何如何调用适当的成员函数呢?
这取决于您希望如何调用这些函数。如果要使用相同的签名调用它们,解决方案非常简单:只需保留一个函数向量。
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
using namespace placeholders;
struct Foo {
void value(int x) { cout << x << endl; }
};
struct Bar {
void sum(int y, int z) { cout << (y + z) << endl; }
};
int main() {
Foo foo;
Bar bar;
vector<function<void(int)>> vec;
vec.push_back(std::bind(&Foo::value, &foo, _1));
vec.push_back(std::bind(&Bar::sum, &bar, _1, 1));
for (auto f : vec) f(1);
return 0;
}
如果想法是保留具有任意数量(和类型)参数的函数向量,则可以使用 std::vector<boost::any>>
.
#include <boost/any.hpp>
int main() {
Foo foo;
Bar bar;
typedef function<void(int)> F1;
typedef function<void(int,int)> F2;
vector<boost::any> vec;
vec.push_back(F1(bind(&Foo::value, &foo, _1)));
vec.push_back(F2(bind(&Bar::sum, &bar, _1, _2)));
for (boost::any& any : vec) {
if (F1* f1 = boost::any_cast<F1>(&any)) (*f1)(1);
else if (F2* f2 = boost::any_cast<F2>(&any)) (*f2)(1, 1);
}
return 0;
}
如果您需要更深入,我建议您阅读有关类型擦除的更多信息。
相关文章:
- 如何正确编写指针函数声明?
- C++常规指针函数或模板
- 如何重新定义 C++ 指针函数?
- C++ 指向其他类函数的指针函数
- 指针到指针函数参数
- 将指向成员的指针函数传递到模板中
- C++ 在 none 常量指针函数中返回一个常量指针
- 如何使用指针函数编写/读取数组
- 是C 中的函数指针函数对象
- 如何从另一个类调用指向成员的指针函数
- 如何声明采用指向成员的指针函数的函数
- 如何构造一个以可变参数指针函数作为成员的类?
- c 通过值或指针函数语法
- 将typedef方法作为指针函数传递
- 从 Main 中的双指针函数打印出指针数组
- strcpy 对指针函数的引用
- 这是否仍然声明一种指针函数的别名?
- 将指向成员的指针函数与 std::shared_ptr 结合使用
- 'Incomplete type' 为标准::函数声明指向成员的指针函数模板参数时出错
- 从注入进程的 DLL 调用函数并更改指针函数的地址