基 class 中的静态方法反映派生的 class 名称
Static method in base class reflect the derived class name
这里是基础 class:
class Product
{
public:
static void RegisterClass() {
string b = __FUNCTION__;
};
}
这里是派生的 class.
class Milk: Product
{}
在主函数中我这样调用静态方法:
main(){
Milk.RegisterClass();
}
然后它将值Product::RegisterClass
写入变量b
。有没有办法在静态方法中获取值Milk::RegisterClass
。
我不想实例化 classes。这个场景背后的主要目标是在某处注册 Milk
字符串。
使用 CRTP 可以很好地实现 OP 提出的相当受限的场景。
正如评论中指出的那样,type_info::name()
充满了不确定性,因此更好的方法是明确说明要使用的字符串:
#include <string>
#include <string_view>
#include <iostream>
template<typename CRTP>
class Product
{
public:
static void RegisterClass() {
std::string b{CRTP::product_name};
std::cout << b << "\n";
};
};
class Milk : public Product<Milk> {
public:
static constexpr std::string_view product_name{"Milk"};
};
int main() {
Milk::RegisterClass();
}
这里是基础 class:
class Product
{
public:
static void RegisterClass() {
string b = __FUNCTION__;
};
}
这里是派生的 class.
class Milk: Product
{}
在主函数中我这样调用静态方法:
main(){
Milk.RegisterClass();
}
然后它将值Product::RegisterClass
写入变量b
。有没有办法在静态方法中获取值Milk::RegisterClass
。
我不想实例化 classes。这个场景背后的主要目标是在某处注册 Milk
字符串。
使用 CRTP 可以很好地实现 OP 提出的相当受限的场景。
正如评论中指出的那样,type_info::name()
充满了不确定性,因此更好的方法是明确说明要使用的字符串:
#include <string>
#include <string_view>
#include <iostream>
template<typename CRTP>
class Product
{
public:
static void RegisterClass() {
std::string b{CRTP::product_name};
std::cout << b << "\n";
};
};
class Milk : public Product<Milk> {
public:
static constexpr std::string_view product_name{"Milk"};
};
int main() {
Milk::RegisterClass();
}