在 C 中,可以使用嵌套帮助程序结构来初始化静态成员。虽然这种方法适用于非模板化类,但它可能会给具有模板参数的类带来挑战。
考虑以下示例,其中在模板类:
<code class="cpp">struct A { struct InitHelper { InitHelper() { A::mA = "Hello, I'm A."; } }; static std::string mA; static InitHelper mInit; static const std::string& getA() { return mA; } }; template<class T> struct B { struct InitHelper { InitHelper() { B<T>::mB = "Hello, I'm B."; } // [3] }; static std::string mB; static InitHelper mInit; // [4] static const std::string& getB() { return mB; } static InitHelper& getHelper() { return mInit; } };</code>
在这种情况下,进行以下观察:
意外的行为源于静态成员初始化的行为模板化的类。根据 ISO/IEC C 2003 标准 (14.7.1),仅当静态数据成员本身以需要其定义存在的方式使用时,才会发生静态数据成员的初始化。
至为了避免依赖隐式初始化并确保一致的初始化顺序,建议在类模板中显式特化静态数据成员。在这种情况下:
<code class="cpp">template<> std::string B<int>::mB = "Hello, I'm B (int specialization).";</code>
通过为模板类的每个实例显式专门化静态数据成员,可以显式触发初始化并实现所需的行为,而无需求助于访问初始化程序助手。
以上是如何使用嵌套辅助结构可靠地初始化模板化 C 类中的静态成员?的详细内容。更多信息请关注PHP中文网其他相关文章!