两个类中的回调函数

时间:2015-05-16 15:14:09

标签: c++ callback

您好我的回调函数有问题。我对c ++很新。 我有两个类助手和导出器:

助手:

class Helper {
    typedef Bool (*IterationCallback)(BaseObject *op);
    public: Int32 RecurseHierarchy (BaseObject* op, IterationCallback callback) {
        Int32 count = 0;
        while (op) {
            if (callback(op)) {
                count++;
                count += RecurseHierarchy(op->GetDown(), callback);
                op = op->GetNext();
            }       
        }
        return count;
    }
};

出口:

class Exporter {
    private: Helper helper;

    private: Bool writeT3D (Filename exportT3D) {

        string filepath = C4DStringToStdString(exportT3D.GetString()); 
        t3DFile.open(filepath.c_str());
        writeBegin();

        // Iterate all objects in the document and writes an actor
        BaseDocument *doc = GetActiveDocument();

        Int32 count = helper.RecurseHierarchy(doc->GetFirstObject(), this->WriteActor);
        writeEnd();
        t3DFile.close();    

        return true;
    }
};

我收到错误C3867 function call missing argument list,我应该使用&Exporter::WriteActor。但我无法解决问题。有人能帮助我吗?

1 个答案:

答案 0 :(得分:0)

问题

假设WriteActorExporter的成员函数,那么它的类型可能是:

Bool (Exporter::*)(BaseObject*)

与以下内容不兼容:

Bool (*)(BaseObject*)

原因是前者在类型Exporter*中传递了一个隐式参数(通常在成员函数中可以作为this访问),而后者则不会发生这种情况。

一种解决方案

由于上述原因,在将结果函数传递给Exporter*之前,需要显式传递RecurseHierarchy类型的隐式参数。

在您的情况下,您可以使用std::bind,如下所示:

using namespace std::placeholders;
auto fn = std::bind(&Exporter::WriterActor, this, _1);
Int32 count = helper.RecurseHierarchy(doc->GetFirstObject(), fn);

然后修改Helper以获取任何可调用对象:

struct Helper {
    template<typename Fn>
    Int32 RecurseHierarchy(BaseObject* op, Fn callback) {
        Int32 count = 0;
        while (op) {
            if (callback(op)) {
                count++;
                count += RecurseHierarchy(op->GetDown(), callback);
                op = op->GetNext();
            }       
        }
        return count;
    }
};

Live demo

如果您还想允许传递std::function个对象和lambda,则上述更改尤为重要。