[英]Using a runtime parameter (variable) in C++ metaprogramming at compile-time
[英]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.