C++模板类中如何兼容调用静态与非静态成员变量?
解决方案
要让MyClass同时兼容静态和非静态的AttributeName成员,只需修改所有原InputClass::AttributeName的调用位置,替换为通过当前实例访问的形式:
- 将所有
InputClass::AttributeName(若为成员函数则是InputClass::AttributeName())替换为static_cast<InputClass*>(this)->AttributeName
原理说明
C++中,静态成员既支持通过类名访问,也支持通过类的实例对象/指针访问;而非静态成员只能通过实例访问。通过static_cast<InputClass*>(this)获取当前子类实例的指针后访问AttributeName,就能同时适配两种成员类型:
- 当
AttributeName是静态成员时,实例指针访问静态成员是合法语法,编译器会正确解析为访问静态变量/函数; - 当
AttributeName是非静态成员时,实例指针直接访问即可获取当前实例的专属成员值。
代码修改示例
原调用写法:
// MyClass内的调用代码 std::string val = InputClass::AttributeName;
修改后写法:
// MyClass内的调用代码 std::string val = static_cast<InputClass*>(this)->AttributeName;
若原调用是成员函数(如InputClass::AttributeName()),修改为:
std::string val = static_cast<InputClass*>(this)->AttributeName();
内容的提问来源于stack exchange,提问作者user1008636
相关产品推荐
相关产品推荐

