模板专业化enable_if

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是否为类/指针以及其他所有情况。

son*_*yao 5

两个FromStringin Property都是函数模板,它们不能覆盖virtual基类的非模板函数。(实际上,功能模板不能是virtualfunction)。

你可以添加其他非模板FromStringProperty; 并且可以使用关键字来确保覆盖orverride。例如

bool FromString(Object* obj, string str) override {
    return FromString<>(obj, str);
}
Run Code Online (Sandbox Code Playgroud)

生活

  • 请注意,如果所有功能的名称都相同,将存在歧义。这将泄漏实现细节,因为FromString(...)在派生类型上始终是模棱两可的,并且要求&lt;&lt;&gt;明确地调用实现。重命名模板将避免这种情况。 (3认同)