【发布时间】:2018-01-17 01:31:16
【问题描述】:
我有一个设计为可继承的Controller 类。它目前有一个name() 纯虚方法,像这样:
class Controller {
public:
virtual const std::string name() const = 0;
}
名称实际上是类属性,而不是实例属性。它不应该在子类的实例之间改变,所以实际上,virtual 并不是最好的做法。无论如何,我现在遇到了一个问题,我需要在编译时在模板函数中使用名称。显然T::name() 不起作用,而且因为子类不是默认可构造的,我什至不能用T()::name() 破解它。
所以有些事情需要改变,但我想不出最好的方法来做到这一点。我需要能够在以下情况下访问名称:
- 在编译时,当我有一个子类类型时(例如
T::name()) - 在运行时,当我有一个子类的实例时(例如
instance->name()) - 在运行时,当我有一个
Controller*(例如指向基类的指针)时
name() 不一定是方法,它可以是公共属性或其他东西。但无论我尝试什么,我似乎只能满足上述 3 个要求中的 2 个。
任何人都可以提出任何解决此问题的好方法吗?
【问题讨论】:
-
“编译时”是什么意思?你需要在编译时用字符串运行什么样的语句?
-
提示:not possible
-
在模板函数中,我需要获取传入类型的名称。例如
template<T> bool has_controller() const { ... need T::name() here ... } -
@Kazade 你想检查它的基类是否是控制器?或者它是否是特定类型?你听说过 C++11 type traits吗?