实现const/非const版本MyArray类,是否有更简洁的方案?
简化const/非const数组类的实现
你可以直接利用C++标准库的std::conditional替代原有的TFactory结构体,彻底消除冗余的命名空间与模板特化代码,同时完全保留原有功能。核心思路是通过编译期条件判断直接推导目标类型,避免重复的结构体定义。
优化后的代码(C++11及以上)
#include <type_traits> // 引入std::conditional template<typename T_, bool M_ = false> class MyArray{ // 根据M_的值推导T类型:M_为true时用T_,否则用const T_ using T = typename std::conditional<M_, T_, const T_>::type; // 同理推导void指针类型 using Void = typename std::conditional<M_, void*, const void*>::type; T* ptr_; size_t size_; public: constexpr MyArray(Void ptr, size_t size) : ptr_(reinterpret_cast<T*>(ptr)), size_(size / sizeof(T)){} explicit constexpr MyArray(std::string_view s) : MyArray(s.data(), s.size()){} public: constexpr size_t size() const{ return size_; } constexpr const auto& operator[](size_t i) const{ return ptr_[i]; } constexpr auto& operator[](size_t i){ return ptr_[i]; } }; template<typename T> using MyArrayMutable = MyArray<T, true>;
C++14及以上的进一步简化
如果编译器支持C++14,可使用std::conditional_t省略typename关键字,让代码更紧凑:
#include <type_traits> template<typename T_, bool M_ = false> class MyArray{ using T = std::conditional_t<M_, T_, const T_>; using Void = std::conditional_t<M_, void*, const void*>; // 剩余代码与上述版本完全一致 }; template<typename T> using MyArrayMutable = MyArray<T, true>;
核心改进说明
- 移除了冗余的
my_array_impl_命名空间和TFactory结构体,类型推导逻辑直接内联到类内部,代码结构更简洁 - 借助标准库原生的
std::conditional完成编译期类型选择,替代手动编写模板特化,可读性与可维护性更强 - 完全保留原有功能:
MyArray<int>对应只读数组,MyArrayMutable<int>对应可修改数组,同时兼容MyArray<const int>这类嵌套const的场景
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

