在子类上调用模板化静态方法时获取类的类型名称

时间:2018-05-24 10:15:44

标签: c++

我能想到的静态方法的最简单的例子是使用它的模板化类型是create()函数。

struct Foo {
    template <typename T = Foo>
    static T *create() {
        return new T();
    }
};

struct Bar : Foo {};
struct Baz : Foo {};

int main() {
    Foo::create();
    Bar::create<Bar>();
    // Bar::create(); // Misleading, creates a Foo instead of Bar
    return 0;
}

我的问题是:我可以添加Foo::create()静态方法,自动检测从哪个类调用它,以避免双重指定类名,即Bar::create()?我想这样做,而不是向create()BarBaz的任何其他后代添加Foo静态方法(因为可能有数千个)。

或许还有一些神奇的关键字可以做到这一点吗?

    template <typename T = this_type>

2 个答案:

答案 0 :(得分:3)

我能想到的最好的是CRTP:

template<class T>
struct Base {
    static T *create() {
        return new T();
    }
};

struct Foo : public Base<Foo> {};
struct Bar : public Base<Bar> {};
struct Baz : public Base<Baz> {};

int main() {
    Foo* foo = Foo::create();
    Bar* bar = Bar::create();
    return 0;
}

答案 1 :(得分:0)

简单的解决方法:添加免费功能

template<typename T>
std::unique_ptr<T> create() {
  return std::unique_ptr<T> { T::template create<T>() };
}

你需要重复T,这是不可避免的,但这样只有一次重复。 (这是不可避免的,因为它只是禁止Foo::create<Bar>的应用程序逻辑