具有不同数据类型的纯虚方法

| 我正在为我的容器类派生一个基类,以便可以维护一致的接口。当前看起来像这样:
template <typename Datatype>
class BaseClass
{
    public:
    virtual Datatype Foo() = 0;
    virtual Datatype Bar() = 0;
};

template <typename Datatype>
class DerivedClass: public BaseClass<Datatype>
{
    public:

    virtual Datatype Foo()
    {
    }

    virtual Datatype Bar()
    {
    }
};
但是,对于我的某些派生类,
Foo()
Bar()
可能需要具有不同的返回类型。在基类中没有每种不同的返回类型的模板参数的情况下,如何为派生类提供一些空间来更改此类事情? 编辑: 派生类使用的类型可能完全不同且不变。实际上,除方法名称外,不保证派生类具有任何共同点。     
已邀请:
无法
return
种不同的数据类型。唯一的方法是使方法
template
受到限制,因为
virtual
方法不能作为模板。     
提供在需要不同结果的情况下特有的特征。
template <typename Datatype>
struct BaseTraits
{
    typedef Datatype FooResult;
    typedef Datatype BarResult;
};

template <typename Datatype, typename Traits = BaseTraits<Datatype> >
class BaseClass
{
    public:
    virtual Traits::FooResult Foo() = 0;
    virtual Traits::BarResult Bar() = 0;
};
    
如果您提前知道潜在类型的数量,则可以通过向基类模板添加其他类型来扩展现有功能...
template <typename FOO_TYPE,typename BAR_TYPE>
class BaseClass
{    
public:    
    virtual FOO_TYPE Foo() = 0;    
    virtual BAR_TYPE Bar() = 0;
};

template <typename FOO_TYPE,typename BAR_TYPE>
class DerivedClass: public BaseClass<FOO_TYPE,BAR_TYPE>
{    
public:    
    virtual FOO_TYPE Foo()    {    }    
    virtual BAR_TYPE Bar()    {    }
};
如果您有多种类型,这可能很快就会失控。     
如果返回类型是协变的,则可以更改它们,或者您可以编写某种转换函数并具有like8ѭ之类的内容。     
特质可能会有所帮助。 《 C ++模板-完整指南》一书提供了一个示例,在标题为“特性和策略类”的一章中对此进行了说明。它有一个使用累加器返回不同类型的示例。 编辑:我可以看到AProgrammer已经给出了一个例子     
#include <iostream>
#include <typeinfo>

using namespace std;

template <typename T, typename R = T>
class base
{
  public:
    virtual R foo() 
    {
      cout << \"foo(): data type = \" << typeid(T).name() << endl; return R();
    }

    virtual R bar()
    {
      cout << \"bar(): return type = \" << typeid(R).name() << endl; return R();
    }
};

int main()
{
  base<int> b;
  base<int, long> b1;

  b.foo(); b.bar();
  b1.foo(); b1.bar();

  cout << typeid(b).name() << endl;
  cout << typeid(b1).name() << endl;

  return 0;
}
上面的程序返回了以下内容: 加上
g++
$ ./rettypetemplate
foo(): data type = i
bar(): return type = i
foo(): data type = i
bar(): return type = l
4baseIiiE
4baseIilE
使用Visual Studio 2005(12):
C:\\Program Files\\Microsoft Visual Studio 8\\VC>rettypetemplate.exe
foo(): data type = int
bar(): return type = int
foo(): data type = int
bar(): return type = long
class base<int,int>
class base<int,long>
尽管此示例显示了如何执行此操作,但AProgrammer给出的答案显示了一种使用特征处理它的好方法。上面的示例适用于基本数据类型,但不适用于用户定义的类型。要处理用户定义的类型,必须采用traits。请参阅Jossutis的\“ C ++模板\”或\“现代C ++设计\”以了解有关特征的更多信息。     

要回复问题请先登录注册