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

Get typename of class when a templated static method is called on a subclass

本文关键字:获取 类型 静态方法 子类 调用      更新时间:2023-10-16

我能想到的利用其模板化的静态方法的最简单的例子就是这个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()?我想这样做,而不向BarBaz或任何其他Foo的后代添加create()静态方法(因为可能有数千个(。

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

template <typename T = this_type>

我能想到的最好的是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;
}

简单的解决方法:添加免费函数

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

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