Mat*_*Mat 2 c++ generics inheritance function
我是泛型类编程的新手,所以也许我的问题很愚蠢 - 很抱歉。我想知道以下事情是否可行,如果可以,该怎么做
我有一个简单的泛型类 Provider,它提供泛型类型的值:
template <class A_Type> class Provider{
public:
A_Type getValue();
void setSubProvider(ISubProvider* subProvider)
private:
A_Type m_value;
ISubProvider* m_subProvider;
};
Run Code Online (Sandbox Code Playgroud)
在 m_subProvider 为 NULL 的情况下,getValue 函数应返回 m_value。但如果 SubProvider 不为 Null,则该值将由 SubProvider 类计算。
所以 subprovider 也必须是泛型类型,但我将它创建为一个没有实现的抽象类:
template <class A_Type> class ISubProvider{
public:
virtual A_Type getValue() = 0;
};
Run Code Online (Sandbox Code Playgroud)
现在我希望 ISubProvider 的实际实现是非泛型的!例如我想实现返回整数类型的 IntegerProvider
class IntegerProvider : public ISubProvider{
int getValue(){return 123;}
};
Run Code Online (Sandbox Code Playgroud)
也许是一个 StringProvider:
class StringProvider : public ISubProvider{
string getValue(){return "asdf";}
};
Run Code Online (Sandbox Code Playgroud)
现在 - 我如何编码整个事情,以便我可以使用
void setSubProvider(ISubProvider* subProvider)
Run Code Online (Sandbox Code Playgroud)
类 Provider 的功能仅具有与 Provider 的泛型类型相对应的子提供程序?
例如,如果我实例化一个 int 类型的提供者:
Provider<int> myProvider = new Provider<int>();
Run Code Online (Sandbox Code Playgroud)
那么就可以调用
myProvider.setSubProvider(new IntegerProvider());
Run Code Online (Sandbox Code Playgroud)
但一定是不可能打电话的
myProvider.setSubProvider(new StringProvider());
Run Code Online (Sandbox Code Playgroud)
我希望您理解我的问题,并能告诉我如何正确创建该代码:)
谢谢!
C++ 有模板(类模板和函数模板),而不是泛型。
鉴于此声明:
template <class A_Type> class ISubProvider;
Run Code Online (Sandbox Code Playgroud)
你不能这样做:
class IntegerProvider : public ISubProvider{
int getValue(){return 123;}
};
Run Code Online (Sandbox Code Playgroud)
因为 ISubProvider 不是一个类,它是一个类模板。
你可以这样做。
class IntegerProvider : public ISubProvider<int> {
int getValue(){return 123;}
};
Run Code Online (Sandbox Code Playgroud)
无论如何,我认为这就是你想要做的。
出于同样的原因,这也不起作用。
template <class A_Type> class Provider {
public:
A_Type getValue();
void setSubProvider(ISubProvider* subProvider)
private:
A_Type m_value;
ISubProvider* m_subProvider;
};
Run Code Online (Sandbox Code Playgroud)
你必须做这样的事情。
template <class A_Type> class Provider {
public:
A_Type getValue();
void setSubProvider(ISubProvider<A_Type>* subProvider);
private:
A_Type m_value;
ISubProvider<A_Type>* m_subProvider;
};
Run Code Online (Sandbox Code Playgroud)
现在您已经实现了您想要的,您必须ISubProvider为与Provider类模板相同的模板类型参数提供一个指向实例的指针。
但是请注意,在这种情况下,使用基于类型模板化的基类并没有真正获得任何好处。
| 归档时间: |
|
| 查看次数: |
5858 次 |
| 最近记录: |