我有一些类,所有的接口都完全相同。这个接口定义了一些方法,其中一些是模板化的(类本身可能会或可能不会)。使用相同的接口传递不同类型的对象
所以界面看起来像这样
class MyClass
{
public:
void Func1();
template <typename T>
void Func2(T param);
};
我有一些它需要符合本接口,但要避免必须在编译时知道确切执行各种对象的功能。
显然,默认的C++解决方案应该有一个基类型,所有这些类派生并传递一个指针,并使用多态性完成所有工作。
问题是模板化的成员函数不能是虚拟的,所以这个方法不能使用。我也想避免改变当前接口集合,因为它们有很多,其中一些定义在我的项目范围之外。
另一种解决方案是对使用这些对象的函数进行模板化,使它们专注于正确的类型。这可能是一个解决方案,但由于遗留需求,大量功能模板可能不可行(这是我不能做任何事情的事情,因为客户端代码不是我负责的东西)。
我最初的想法是提供某种类型的载体类,它是类型中性的,并且在效果中包含了这里的通用接口,并且有一个基类接口类来传递内部类型。
东西沿着
class MyInterface
{
public:
virtual void Func1() = 0;
};
template <typename T>
class MyImplementation
{
public:
virtual void Func1()
{
m_impl->Func1();
}
private:
T* m_impl;
};
线但同样的模板成员函数似乎阻止这种做法。
我看了一下boost :: any和boost :: function类,我认为它们可以提供某种解决方案,但它们似乎并没有给我正确的答案。
那么,有没有人有任何建议或解决如何使这成为可能,如果的确如此?就我个人而言,我倾向于对需要这些对象的各种功能进行模板化 - 因为这是功能模板提供的 - 但认为它值得首先进行调查。
在此先感谢
你真的想解决什么问题? – 2010-07-19 14:45:20
我有很多函数采用符合这个接口的各种对象,但是想避免在编译时需要知道确切的实现。 – 2010-07-19 14:57:40
您可以尝试检查有关您的主要问题的问题:如何解决虚拟模板功能问题。我知道我之前看到过这个问题。我不确定你是否会在那里找到你的解决方案,但这将是一个好的开始。 – n1ckp 2010-07-19 15:09:05