C++ 泛型类和继承

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)

我希望您理解我的问题,并能告诉我如何正确创建该代码:)

谢谢!

CB *_*ley 5

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类模板相同的模板类型参数提供一个指向实例的指针。

但是请注意,在这种情况下,使用基于类型模板化的基类并没有真正获得任何好处。