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

如何实现支持编译期选择的可变与const版本constexpr getter

编译期集合选择的const/非const访问解决方案

直接给你解决方法:为模板化的get()提供const和非const两个重载版本,让编译器根据对象的const属性自动匹配,同时保持编译期的分支判断逻辑。

修改后的完整代码

#include <set>

struct TwoSets 
{
    // 非const版本:返回可变引用,支持插入等修改操作
    template <int i> constexpr std::set<int>& get() noexcept 
    {
        static_assert(i == 0 || i == 1, "集合索引只能是0或1");
        if constexpr (i == 0) {
            return first;
        } else {
            return second;
        }
    }

    // const版本:返回const引用,仅支持只读访问
    template <int i> constexpr const std::set<int>& get() const noexcept 
    {
        static_assert(i == 0 || i == 1, "集合索引只能是0或1");
        if constexpr (i == 0) {
            return first;
        } else {
            return second;
        }
    }
    
    std::set<int> first;
    std::set<int> second;
};

为什么这样可行?

  • 当操作非const的TwoSets对象时,编译器会匹配第一个非const版本的get(),返回可变引用,能正常执行insert()这类修改操作。
  • 当操作const的TwoSets引用/对象时,编译器会自动选择第二个const版本的get(),返回const引用,只能调用size()这类只读成员函数,符合const对象的访问规则。

测试代码验证

#include <iostream>

int main() {
    // 非const对象:修改集合
    TwoSets sets;
    sets.get<0>().insert(0);
    sets.get<1>().insert(100);

    // const引用:只读访问
    const TwoSets& const_sets = sets;
    std::cout << "第一个集合大小:" << const_sets.get<0>().size() << std::endl;
    std::cout << "第二个集合大小:" << const_sets.get<1>().size() << std::endl;

    return 0;
}

这段代码可以正常编译运行,同时满足编译期选集合、两种访问权限的需求。

内容的提问来源于stack exchange,提问作者Jeff L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:22:51