You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 15:55:43