如何在不使用C ++模板的情况下为访问者实现提供lambda函数?

时间:2014-09-02 15:21:13

标签: templates c++11

我目前在这些方面有一些代码:

namespace
{
    template <class TUseDataFunc>
    class DataOwnerCallback : public IDataOwnerCallback
    {
    public:
        DataOwnerCallback(const TUseDataFunc& useDataFunc)
        : m_UseDataFunc(useDataFunc)
        {}

        virtual void visit(Data& data) override
        {
            m_UseDataFunc(data);
        }

    private:
        const TUseDataFunc& m_UseDataFunc;
    };
}

void Processor::doProcess(DataOwner& dataOwner)
{   
    auto useDataFunc = [this](Data& data) { useData(data); };
    DataOwnerCallback<decltype(useDataFunc)> callback(useDataFunc);
    dataOwner.accept(callback);
}

void Processor::useData(Data& data)
{
    // Use the data, accessing private functionality via friendship
    data.privateFunction();
    // etc
}

这里的课程角色如下:

  • Data个对象包含Processor实例
  • 完成的处理结果
  • Processor个对象,通过友情,调用Data个对象的私有成员在Data个对象中设置处理结果
  • Data对象由DataOwner类的实例拥有,该实例提供访问自有数据的功能
  • DataOwnerCallbackProcessor
  • 的私人实施细节

由于需要在Data中调用私有函数,DataOwnerCallback无法直接执行处理,但必须延迟回调用它的Processor类(不能将友谊授予{ {1}}和DataOwnerCallback接口无法更改)。这是通过将lambda传递给IDataOwnerCallback's来完成的,该DataOwnerCallback捕获Processor's这个指针。为了构造具有最小噪声的DataOwnerCallback,我使用decltype来提供所需的模板参数。

有几种可能的替代方案,其中一些可以避免模板DataOwnerCallback

  • 接受构造函数并保留对std::function<void (Data&)>
  • 的引用
  • Processor实施IDataOwnerCallback
  • 在匿名命名空间中使用模板化自由函数构造DataOwnerCallback,从传递的useDataFunc推断其模板参数。

我的问题是,有没有其他方法可以通过Processor::useData通过DataOwnerCallback调用DataOwnerCallback而不模板化{{1}}(在此问题中给出的约束并且不使用上面建议的替代方案)?

0 个答案:

没有答案