【问题标题】:Static method in base class reflect the derived class name基类中的静态方法反映派生类名称
【发布时间】:2021-11-10 23:43:09
【问题描述】:

这是基类:

class Product
{
public:
    static void RegisterClass() {
        string b = __FUNCTION__;
    };
}

这里是派生类。

class Milk: Product
{}

在主函数中我这样调用静态方法:

main(){
    Milk.RegisterClass();
}

然后它将值Product::RegisterClass 写入变量b。有没有办法在静态方法中获取值Milk::RegisterClass

我不想实例化这些类。而这个场景背后的主要目标是在某处注册Milk字符串。

【问题讨论】:

  • 我觉得你运气不好。没有Milk::RegisterClass。只有Zuul...呃Product::RegisterClass.
  • 您能否在此处扩展您的实际用例?正如所写的,这个例子是人为的,每一个 sn-p 都至少有一个错误。这些东西在哪里“注册”?与其让类自己注册,不如考虑一种更常见的模式(eg 类工厂),您可以使用简单的宏按名称和字符串注册所有类,而无需在类上使用任何注册函数本身。
  • 静态类方法不属于类的任何实例,既不是基类也不是派生类。 C++ 不能以这种方式工作。
  • 您的用例可以接受修改结构以引入 CRTP 吗?如果是这样,您可以执行以下操作:gcc.godbolt.org/z/WqK3dGezb
  • 类工厂方法不需要很复杂。这是我快速敲出的一个示例来演示:godbolt.org/z/5vvdeTo3G

标签: c++ inheritance reflection static-methods


【解决方案1】:

使用 CRTP 可以相当好地实现 OP 呈现的相当受限的场景。

正如 cmets 中所指出的,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();
}

【讨论】:

    猜你喜欢
    • 2012-05-24
    • 2015-04-08
    • 2019-08-23
    • 2012-06-25
    • 2011-03-05
    • 2010-10-10
    • 2010-11-22
    • 1970-01-01
    • 2014-04-27
    相关资源
    最近更新 更多