我有一个带有模板函数的类:
富.h:
class Foo {
public:
int some_function();
bool some_other_function(int a, const Bar& b) const;
template<typename T>
int some_template_function(const T& arg);
};
template<typename T>
int Foo::some_template_function(const T& arg){
/*...generic implementation...*/
}
现在我已经到了希望能够通过代理类访问 Foo 的地步,就像在代理设计模式中一样。
直观地说,我想重构如下(以下代码不正确,但它表达了我的“理想化”API):
FooInterface.h:
class FooInterface {
public:
virtual int some_function()=0;
virtual bool some_other_function(int a, const Bar& b) const=0;
template<typename T>
virtual int some_template_function(const T& arg)=0;
};
FooImpl.h:
#include "FooInterface.h"
/** Implementation of the original Foo class **/
class FooImpl : public FooInterface {
public:
int some_function();
bool some_other_function(int a, const Bar& b) const;
template<typename T>
int some_template_function(const T& arg);
};
template<typename T>
int FooImpl::some_template_function(const T& arg){
/*...generic implementation...*/
}
FooProxy.h:
#include "FooInterface.h"
class FooProxy : public FooInterface{
protected:
FooInterface* m_ptrImpl; // initialized somewhere with a FooImpl*; unimportant in the context of this question
public:
int some_function()
{ return m_ptrImpl->some_function(); }
bool some_other_function(int a, const Bar& b) const
{ return m_ptrImpl->some_other_function(a,b); }
template<typename T>
int some_template_function(const T& arg)
{ return m_ptrImpl->some_template_function(arg); }
};
但是这段代码惨遭失败。
首先,FooImpl
不能编译,因为类模板函数不能是虚拟的。
更重要的是,即使我玩弄 的定义some_template_function
,即使我将它重新定位到一个具体的类或其他一些陪审团操纵,它仍然会对在首先,因为模板代码需要在标题中定义并包含在内。这将强制FooProxy.h
包含FooImpl.h
,并且FooImpl.h
需要实现所需的所有实现细节和文件包含some_template_function
。因此,如果我使用代理模式来掩盖实现细节,使自己远离具体实现,并避免不必要的文件包含,那么我就不走运了。
有没有办法将代理模式或其一些变体应用于具有模板函数的类?或者这在 C++ 中是不可能的吗?
背景:目前,我正在尝试为一组具有预先存在的内置日志记录机制的类提供代理访问。我为该日志提供的唯一 API 使用可变参数模板,因此无法预测将使用的参数组合。我希望实现和使用代理的客户端之间的分离尽可能干净,我需要尽量减少从客户端到实现的依赖关系,但我确实需要它们写入同一个日志。
但是,我对这个问题感兴趣,而不是我的直接问题。让我感到困惑的是,模板在主要设计模式中戳出这样一个漏洞,而且我还没有发现这个问题在任何地方都得到了解决。