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
相关产品推荐
相关产品推荐

