我能想到的静态方法的最简单的例子是使用它的模板化类型是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()
和Bar
或Baz
的任何其他后代添加Foo
静态方法(因为可能有数千个)。
或许还有一些神奇的关键字可以做到这一点吗?
template <typename T = this_type>
答案 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>
的应用程序逻辑