我目前在这些方面有一些代码:
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
类的实例拥有,该实例提供访问自有数据的功能DataOwnerCallback
是Processor
由于需要在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}}(在此问题中给出的约束并且不使用上面建议的替代方案)?