如何创建底层实现相同但类型独立的A、B、C三种类型?
解决方案:私有标签类+模板复用实现
要实现A、B、C三个完全独立、无隐式转换但共享全部功能的类型,最靠谱的方式是用私有嵌套标签类搭配模板基类,彻底堵死外部创建等价类型的可能,同时复用代码。
具体实现
第一步:封装通用功能的模板基类
先把所有共享的逻辑写到一个模板基类里,模板参数用标签类来区分不同实例:
template<typename Tag> class CommonCore { public: // 所有共享的功能都写在这 void printVal() const { std::cout << m_val << std::endl; } void setVal(int newVal) { m_val = newVal; } protected: // 构造函数设为protected,只允许派生类调用 CommonCore(int val) : m_val(val) {} private: int m_val; // 共享的成员变量 };
第二步:定义独立的A、B、C类
每个类内部定义私有嵌套的标签结构体,然后通过组合的方式复用CommonCore:
#include <iostream> class A { // 私有标签,外部完全访问不到 struct InternalTag {}; // 用私有标签实例化通用模板 using Core = CommonCore<InternalTag>; public: // 转发构造函数到核心实现 A(int val) : m_core(val) {} // 直接暴露核心类的公共接口,不用重复写代码 using Core::printVal; using Core::setVal; private: Core m_core; }; class B { struct InternalTag {}; using Core = CommonCore<InternalTag>; public: B(int val) : m_core(val) {} using Core::printVal; using Core::setVal; private: Core m_core; }; class C { struct InternalTag {}; using Core = CommonCore<InternalTag>; public: C(int val) : m_core(val) {} using Core::printVal; using Core::setVal; private: Core m_core; };
为什么这个方案能解决你的问题?
- 绝对独立的类型:A、B、C的
InternalTag是各自类的私有成员,外部根本拿不到这个类型,所以没人能像之前那样创建等价的RogueType,彻底避免别名问题。 - 完全复用实现:所有功能都在
CommonCore里写一次,A、B、C只需要转发接口,没有代码冗余。 - 无隐式转换:A、B、C是三个完全不同的类,编译器不会允许它们之间的隐式转换,完全符合你的要求。
可选:用CRTP让通用逻辑能操作派生类
如果你的通用功能需要访问派生类的专属成员,可以用奇异递归模板模式(CRTP),同样结合私有标签:
template<typename Derived, typename Tag> class CommonCore { public: void syncVal() { // 直接访问派生类的成员 static_cast<Derived*>(this)->m_customVal = m_val; } protected: int m_val; CommonCore(int val) : m_val(val) {} }; class A : public CommonCore<A, struct A::InternalTag> { // 让基类能访问私有成员 friend class CommonCore<A, InternalTag>; struct InternalTag {}; int m_customVal; public: A(int val) : CommonCore(val), m_customVal(0) {} };
内容的提问来源于stack exchange,提问作者0Nicholas
相关产品推荐
相关产品推荐

