如何在可能是任何类的属性的 void 函数上创建 typedef?

Posted

技术标签:

【中文标题】如何在可能是任何类的属性的 void 函数上创建 typedef?【英文标题】:How to make typedef on void function that could be property of any class? 【发布时间】:2011-01-30 21:01:57 【问题描述】:

当我们这样做时

typedef void FuncCharPtr(char*, int) ;
vector<FuncCharPtr*> FuncVec ;
void Add(FuncCharPtr* f)

    FuncVec.push_back(f);

我们不允许像 FuncCharPtr 类型一样传递

 void (someClass::*)b(char*, int);
 void (someOtherClass::*)b(char*, int);

我们希望将两个类的函数链接保留在同一个向量中,以便能够通过类似的方式一次调用所有订阅者

void CastData(char * data, int length)
    for(size_t i = 0 ; i < FuncVec.size(); i++)
        char* dataCopy = new char[length];
        memcpy(dataCopy, data, length);
        FuncVec[i](dataCopy, length);
                    delete[] dataCopy;
    

如何解决这样的问题?

【问题讨论】:

【参考方案1】:

您不能为此使用函数指针。类类型是指向成员函数的指针类型的一部分,因此没有一种类型可以工作。

完成您想做的事情的最佳方法是使用来自 Boost、C++ TR1 或 C++0x 的 the function class 和 the bind function。

您可以维护一个std::vector&lt;std::function&lt;void(char*, int)&gt; &gt; 并使用bind 函数将指向成员函数的指针绑定到您希望调用该成员函数的类的实例:

struct A  void foo(int)   ;
struct B  void bar(int)   ;

typedef std::function<void(int)>   Function;
typedef std::vector<Function>      FunctionSequence;
typedef FunctionSequence::iterator FunctionIterator;

FunctionSequence funcs;

A a;
B b;

funcs.push_back(std::bind(&A::foo, &a, std::placeholders::_1));
funcs.push_back(std::bind(&B::bar, &b, std::placeholders::_1));

// this calls a.foo(42) then b.bar(42):
for (FunctionIterator it(funcs.begin()); it != funcs.end(); ++it)
    (*it)(42);

【讨论】:

您能否提供有关如何实现 std::vector<:function int>> 解决方案的任何链接或代码示例?真是太棒了! @Kabumbus:它看起来就像我在此处的示例中展示的那样。您的参数类型会因函数的实际类型而异。 我喜欢你的课...并以某种方式更新了它...并在此处描述了错误***.com/questions/4853263/… (供未来的读者使用)以及关于此方法和 boost::bind 的另一个讨论可以在这里找到***.com/questions/4853542/…

以上是关于如何在可能是任何类的属性的 void 函数上创建 typedef?的主要内容,如果未能解决你的问题,请参考以下文章

构造函数用于创建类的实例对象,构造函数名应与类名相同,返回类型为void.

构造函数

如何防止其他人在堆栈上创建您的类的新实例?

拷贝函数和构造函数

构造函数主要特点

如何创建一个可以操作同一类的多个对象的函数,访问 C++ 中的私有属性?