带模板成员的模板类

时间:2014-05-30 21:37:30

标签: c++ templates inheritance

我有以下类结构。

class Base {
  protected:
    template <typename Type>
    Type convert(); // no implementation

  public:
    template <typename Type>
    operator Type() { 
      Type t(convert<Type>());
      // log conversion
      return t;
    }
  }
};

class D1: public Base
{
   protected:
     template <type Type>
     Type convert() {
       Type t;
       // Set t
       return t;
     }
 };

 template <typename Type>
 class D2: public Base
 {
    public:
      D2(Type v): value(v) {}

    protected:
      template <typename Type2>
      Type2 convert() {
          return value;
      }

    private:
      Type value;

 }

我正在寻找一个非模板化的类,可以通过类型转换将其转换为不同的类型。我不想让Base成为一个模板化的类,因为它使它的使用方式变得复杂。

我想强制D2只允许Type2和Type成为同一个类。如上所述,如果Type可以转换或转换为Type2,代码将起作用。我对于convert是否应该被声明为虚拟(答案似乎是否)和部分嵌套特化而感到困惑。

我想在

的D2中提供一个专业化
template <typename Type>
template <>
Type D2<Type>::convert<Type>() { ... }

但显然this is not allowed

我也试过

template <>
template <typename Type>
Type D2<Type>::convert<Type>() { ... }

抱怨“类型D2 :: convert()const'的原型与'D2'类中的任何一个都不匹配

我无法在转换时删除模板,因为D1需要它。

有没有办法让它发挥作用?

在高层次上,我需要的是能够做到以下几点:

Base *b = new D1(/*stuff*/);
int i = *b; // calls D1::convert<int>                  (a)
b = new D1(/*different stuff*/);
std::string s = *b; // calls D1::convert<std::string>  (b)
b = new D2<int>(/* other stuff */);
int j = *b; // calls D2<int>::convert<int>             (c)
b = new D2<std::string>(/*still other args*/);
s = *b; // calls D2<std::string>::convert<std::string> (d)

// This should fail as a compile time or link time error
b = new D2<int>(/*... */);
std::string s_fail = *b; // convertable to int, not string
   // tries to call D2<int>::convert<std::string>, which is either 
   // not implemented or has an implementation that fails to compile, 
   // probably by casting an int to string             (e)

理想的行为是:

(a)调用D1中返回int的方法 (b)在D1中调用返回字符串
的方法 (c)调用D2&lt; int&gt;中的方法。返回一个int
(d)在D2&lt; string&gt;中调用方法返回一个字符串
(e)尽可能早地失败,最好是在编译时或链接时

这在C ++中是不可能的?我很乐意重写除Base的公共接口之外的所有内容,D1不是模板化的,而D2是模板化的。

编辑:澄清我想要的行为

0 个答案:

没有答案