如何在类外部定义static constexpr原生数组成员?
将C++17类的static constexpr数组移至类外部
问题背景
原有代码在类内部直接定义并初始化static constexpr字符串数组可正常运行,但随着需要添加3位(1000元素)、4位(10000元素)的大数组,类定义会变得臃肿。需要将这些数组移至类外部,隐藏在实现文件或头文件的类定义之后,同时符合C++17语法。
解决方案步骤
- 类内仅声明数组:在
Foo类的私有部分只声明static constexpr数组,不进行初始化,避免类定义膨胀。 - 类外定义并初始化数组:在类定义之后(头文件末尾或单独的实现文件中),使用正确的语法定义并初始化这些数组。
完整代码示例
头文件(Foo.h)
#pragma once #include <iostream> class Foo { public: template <class Index> static constexpr const char* digitU2(const Index a) { return s_digitU2s[a]; } template <class Index> static constexpr const char* digitU3(const Index a) { return s_digitU3s[a]; } template <class Index> static constexpr const char* digitU4(const Index a) { return s_digitU4s[a]; } private: // 仅声明static constexpr数组,不初始化 static constexpr const char* s_digitU2s[100]; static constexpr const char* s_digitU3s[1000]; static constexpr const char* s_digitU4s[10000]; };
数组定义部分(可放在Foo.h末尾或单独的Foo.cpp)
// 定义并初始化2位数组 constexpr const char* Foo::s_digitU2s[100] = { "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "90", "91", "92", "93", "94", "95", "96", "97", "98", "99" }; // 3位数组定义(示例省略部分元素,实际补全所有1000个) constexpr const char* Foo::s_digitU3s[1000] = { "000", "001", "002", /* ... 中间元素省略 ... */ "998", "999" }; // 4位数组定义(同理补全所有10000个元素) constexpr const char* Foo::s_digitU4s[10000] = { "0000", "0001", /* ... 中间元素省略 ... */ "9998", "9999" };
主函数测试代码
int main() { std::cout << Foo::digitU2(42) << std::endl; std::cout << Foo::digitU3(123) << std::endl; std::cout << Foo::digitU4(5678) << std::endl; return 0; }
关键语法说明
- C++17中,类外定义
static constexpr成员时,不需要重复写static关键字,直接使用constexpr修饰即可。 - 如果将数组定义放在头文件中,必须添加头文件保护(
#pragma once或传统的#ifndef卫士),防止重复定义编译错误。 - 这些
constexpr数组会在编译期完成初始化,不会带来额外的运行时开销,同时保持了类定义的简洁性。
内容的提问来源于stack exchange,提问作者user1722025
相关产品推荐
相关产品推荐

