我是通用类编程的新手,所以也许我的问题很愚蠢 - 对不起。我想知道以下事情是否可行 - 如果是,那该怎么做
我有一个简单的泛型类Provider,它提供泛型类型的值:
template <class A_Type> class Provider{
public:
A_Type getValue();
void setSubProvider(ISubProvider* subProvider)
private:
A_Type m_value;
ISubProvider* m_subProvider;
};
如果m_subProvider为NULL,则getValue函数应返回m_value。但是如果SubProvider不是Null,则该值应由SubProvider类计算。
所以subprovider也必须是泛型类型,但我将它创建为抽象类而不实现:
template <class A_Type> class ISubProvider{
public:
virtual A_Type getValue() = 0;
};
现在我希望ISubProvider的实际实现是非泛型的!例如,我想实现IntegerProvider,它返回Integer类型
class IntegerProvider : public ISubProvider{
int getValue(){return 123;}
};
也许是StringProvider:
class StringProvider : public ISubProvider{
string getValue(){return "asdf";}
};
现在 - 如何编写整个内容,以便我可以使用
void setSubProvider(ISubProvider* subProvider)
类Provider的功能只有一个与Provider的泛型类型相对应的子提供者?
例如,如果我实例化类型为int的提供者:
Provider<int> myProvider = new Provider<int>();
那么就可以打电话了
myProvider.setSubProvider(new IntegerProvider());
但是无法调用
myProvider.setSubProvider(new StringProvider());
我希望您理解我的问题并告诉我如何正确创建该代码:)
谢谢!
答案 0 :(得分:3)
C ++有模板(类模板和函数模板),而不是泛型。
鉴于此声明:
template <class A_Type> class ISubProvider;
你不能这样做:
class IntegerProvider : public ISubProvider{
int getValue(){return 123;}
};
因为ISubProvider不是类,所以它是一个类模板。
你可以这样做。
class IntegerProvider : public ISubProvider<int> {
int getValue(){return 123;}
};
我认为无论如何这都是你想做的。
出于同样的原因,这也行不通。
template <class A_Type> class Provider {
public:
A_Type getValue();
void setSubProvider(ISubProvider* subProvider)
private:
A_Type m_value;
ISubProvider* m_subProvider;
};
你必须做这样的事情。
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;
};
现在,您已经实现了所需的功能,您必须为与ISubProvider
类模板相同的模板类型参数提供Provider
即时指针。
但请注意,在这种情况下,通过使用模板化类型的基类,您还没有真正获得任何东西。
答案 1 :(得分:1)
您需要以下列方式从您的ISubProvider派生
class IntegerProvider : public ISubProvider<int>
class StringProvider : public ISubProvider<string>
等等
同时更改类声明
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;
};
答案 2 :(得分:0)
如果您放弃提供者/子提供者的单独想法并且只创建一个提供者,那么您的问题就会自行解决。
template <class A_Type> class Provider{
typedef Provider< A_Type > my_type;
public:
A_Type getValue();
void setSubProvider(my_type* subProvider)
private:
A_Type m_value;
my_type* m_subProvider;
};