繁体   English   中英

C ++编译时和运行时可用名称属性

[英]C++ compile-time and runtime available name attribute

我有一个被设计为继承的Controller类。 当前,它具有一个name()纯虚拟方法,如下所示:

class Controller {
public:
    virtual const std::string name() const = 0;
}

该名称实际上是一个类属性,而不是实例属性。 它不应该在子类的实例之间更改,因此,实际上,虚拟并不是最好的选择。 无论如何,我现在遇到了一个问题,我需要在编译时在模板函数中使用该名称。 显然T::name()不起作用,并且因为子类将无法默认构造,所以我什至无法使用T()::name()破解它。

因此,有些事情需要更改,但是我无法找出实现此目的的最佳方法。 在以下情况下,我需要能够访问名称:

  • 在编译时,当我有子类类型时(例如T::name()
  • 在运行时,当我有一个子类的实例时(例如instance->name()
  • 在运行时,当我有一个Controller* (例如,指向基类的指针)时

name()不必一定是方法,它可以是一个公共属性,或其他。 但是,我尝试过的所有事情似乎只能满足上述3个要求中的2个。

谁能提出解决这个问题的任何好的方法?

不幸的是,您不能将静态方法声明为虚方法,因此无法进行以下操作:

struct BaseClass {
  static virtual std::string name() =0;
};

struct ChildClass  {
  static std::string name() {
    return "my_name";
  }
};

您可以改用名称稍有不同的方法:

struct BaseClass {
  virtual std::string name() =0;
};

struct ChildClass  {
  std::string name() {
    return ChildClass::_name(); 
  };

  static std::string _name() {
    return "my_name";
  }
};

适用于您描述的三种情况:

ChildClass c;
BaseClass& b = c;
std::cout << ChildClass::_name() << std::endl;
std::cout << c.name() << std::endl;
std::cout << b.name() << std::endl;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM