我有以下类结构。
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>() { ... }
我也试过
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是模板化的。
编辑:澄清我想要的行为