如何设计同时支持const/非const成员函数、可接收const原始指针的C++类?
解决方案
核心思路
将Vector改造为模板类,通过元素类型的const属性自动区分可写/只读实例,不需要重复编写两套业务逻辑,所有公共代码仅实现一次,由编译器自动生成对应const/非const版本的类。
完整实现代码
#include <type_traits> // 通用模板实现,所有逻辑仅写一次 template <typename T> class VectorImpl { public: explicit VectorImpl(T* ptr_, int size_) : ptr(ptr_), size(size_) {} // 仅非const实例可调用的修改操作 // 若使用C++20可加约束优化报错提示:requires (!std::is_const_v<T>) void notConstOperation() { // T为const类型时此处会自动编译报错,符合安全要求 ptr[0] = ptr[0] + 1; } // 所有实例都可调用的只读操作 double constOperation() const { return ptr[0]; } private: T* ptr; int size; }; // 定义别名兼容原有使用习惯 using Vector = VectorImpl<double>; using ConstVector = VectorImpl<const double>; // 工厂函数实现 // 接收非const指针返回可写实例 Vector createVectorFromPtr(double* ptr, int size) { return Vector(ptr, size); } // 接收const指针返回只读实例 ConstVector createVectorFromConstPtr(const double* ptr, int size) { return ConstVector(ptr, size); } // 全局操作函数适配 // 原有非const操作接口,仅接收可写Vector int doNotConstOperation(Vector& vec) { vec.notConstOperation(); return 0; } // 通用只读操作接口,支持任意Vector/ConstVector实例 template <typename T> int doConstOperation(const VectorImpl<T>& vec) { return vec.constOperation(); }
使用示例
完全符合你要求的调用规则:
int main() { // 只读场景 const double* cptr = new double[10]{0}; const ConstVector cvec = createVectorFromConstPtr(cptr, 10); cvec.constOperation(); // 正常调用 doConstOperation(cvec); // 正常调用 // cvec.notConstOperation(); // 编译报错,符合预期 // doNotConstOperation(cvec); // 编译报错,符合预期 // 可写场景 double* ptr = new double[10]{0}; Vector vec = createVectorFromPtr(ptr, 10); vec.notConstOperation(); // 正常调用 doNotConstOperation(vec); // 正常调用 vec.constOperation(); // 也可调用只读接口 doConstOperation(vec); // 也可传入只读接口 return 0; }
内容的提问来源于stack exchange,提问作者Xu Hui
相关产品推荐
相关产品推荐

