Stu*_*urm 5 c++ templates overriding enable-if
我正在尝试以这种方式专门化模板:
class PropertyBase
{
public:
SfPropertyBase(string name)
{
Name = name;
}
virtual ~SfPropertyBase() {}
string Name;
virtual bool FromString(Object* obj, string str) = 0;
};
template< typename T>
class Property : public SfPropertyBase
{
public:
Property(string name) : SfPropertyBase(name)
{
//specific to Property stuff
}
template<typename U = T>
typename std::enable_if<(std::is_class<U>::value && std::is_pointer<U>::value), bool>::type
FromString(Object* obj, string str)
{
//do something
return true;
}
template<typename U = T>
typename std::enable_if<!std::is_class<U>::value || !std::is_pointer<U>::value), bool>::type
FromString(Object* obj, string str)
{
//do something
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,当我尝试初始化此类的实例时:
auto prop = new Property<int>("IntProperty");
Run Code Online (Sandbox Code Playgroud)
我懂了invalid new-expression of abstract class type Property<int>。我知道在中有一个抽象函数PropertyBase,但是我也为Property,哪里T是类和哪里不是都提供了专门化。
发生了什么事以及如何解决?
注意:我要实现的是专门研究FromStringT是否为类/指针以及其他所有情况。
两个FromStringin Property都是函数模板,它们不能覆盖virtual基类的非模板函数。(实际上,功能模板不能是virtualfunction)。
你可以添加其他非模板FromString中Property; 并且可以使用关键字来确保覆盖orverride。例如
bool FromString(Object* obj, string str) override {
return FromString<>(obj, str);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
106 次 |
| 最近记录: |