在子类上调用模板化静态方法时获取类的类型名
Get typename of class when a templated static method is called on a subclass
我能想到的利用其模板化的静态方法的最简单的例子就是这个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()
?我想这样做,而不向Bar
和Baz
或任何其他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>
(
相关文章:
- 类型ID,如何仅获取类型名称
- 如何获取类型是否真正可移动可构造
- 如何从模板获取类型和值信息
- 如何通过从变量中获取类型来访问内部 typedef
- 在libclang中获取类型不合格的版本
- 如何从通用指针类型中获取类型
- 在编译时从变体中获取类型
- 获取类型列表中的类型的索引
- 从参数包获取类型定义
- C++:在映射中存储类对象(错误:获取类型为"Node"的临时对象的地址)
- 我能否以 constexpr 方式获取C++类型名称
- 在运行时获取类型参数
- C++是静态类型语言,为什么我们可以在运行时获取类型
- 使用 xerces 读取 XML:获取类型,其中 <nodeName type= "typeName" >
- 从模板中的类获取类型
- 如何在可变类型包中获取类型的索引
- 模板:获取类型并映射到函数
- 获取类型为"节点"的临时对象的地址
- 从模板模板方法参数中获取类型
- 在c++编译时获取类型名称