You need to enable JavaScript to run this app. C++非静态非const变量模板的等效替代解决方案咨询
优惠活动
大模型
产品
解决方案
定价
更多

C++非静态非const变量模板的等效替代解决方案咨询

替代实现方案

C++标准暂不支持非静态成员变量模板,你可以通过std::tuple存储所有参数对应数组实例的方式实现同等效果,核心思路是把Arguments参数包展开为对应的std::array类型,组合成tuple作为类的成员,调用getArray时通过类型匹配从tuple中取出对应元素。

完整实现代码

#include <array>
#include <tuple>

template<typename T_, size_t size_>
struct arg
{
    using T = T_;
    static constexpr size_t size = size_;
};

// 辅助工具:将单个arg类型转换为对应的std::array类型
template<typename Arg>
using arg_to_array = std::array<typename Arg::T, Arg::size>;

template<typename... Arguments>
struct Foo
{
    // 成员为所有arg对应array组成的tuple
    std::tuple<arg_to_array<Arguments>...> arr_tuple;

    template<typename Argument>
    arg_to_array<Argument>& getArray()
    {
        // 按类型从tuple中取出对应array实例
        return std::get<arg_to_array<Argument>>(arr_tuple);
    }
};

int main()
{
    Foo<arg<int, 10>> myFoo;
    myFoo.getArray<arg<int, 10>>()[0] = 1;
    Foo<arg<int, 10>> myFoo2;
    myFoo2.getArray<arg<int, 10>>()[0] = 2;
    // 此时两个实例的数组独立,myFoo的数组首元素为1,myFoo2的为2,符合需求
}

注意事项

  • 如果Arguments参数包中存在重复的arg类型,std::get会报编译错误,符合每个Argument对应唯一数组的语义
  • 该实现完全兼容C++17及以上标准,无额外依赖
  • 每个Foo实例的数组独立存储,不会出现静态变量跨实例干扰的问题

内容的提问来源于stack exchange,提问作者Gian Laager

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 01:51:01