sách gpt4 ăn đã đi

c++ - 如何保证模板结构中 const 静态成员的初始化顺序

In lại 作者:太空狗 更新时间:2023-10-29 23:07:54 25 4
mua khóa gpt4 giày nike

我有两个模板结构,每个结构都包含一个常量静态成员变量。这些成员变量之一的初始化取决于第二个。因此,我希望能够保证第二个在第一个之前初始化。这是一个简化的示例:

依赖.hpp:

template struct value { };

template
struct Dependency {
Dependency() {}
Dependency(T v) : var(v) {}
const static Dependency staticVar;
T var;
};

template
const Dependency Dependency::staticVar = Dependency(1.5);

测试结构.hpp:

#include "dependency.hpp"

//template class Dependency; [1]
//template class Dependency; [2]

template
struct TestStruct {
TestStruct(Dependency v) : var(v.var) {}

const static TestStruct staticVar;
T var;
};

template
const TestStruct TestStruct::staticVar = TestStruct(Dependency(Dependency::staticVar));

测试.cpp:

#include 
#include "testStruct.hpp"

sử dụng không gian tên std;

int main(int argc, char *argv[])
{
cout << "TestStruct " << TestStruct::staticVar.var << endl;
cout << "Dependency " << Dependency::staticVar.var << endl;

lệnh cout << kết thúc;

cout << "Dependency " << Dependency::staticVar.var << endl; // [3]
cout << "TestStruct " << TestStruct::staticVar.var << endl;

trả về 0;
};

main的输出是

TestStruct 0
Dependency 1.5

Dependency 1.5
TestStruct 1.5

也就是TestStructcủa staticVarnếu như Dependency 则正确初始化已经为 T 类型实例化了, 但它仍然为 0,因为 Dependency::staticVar尚未初始化。取消注释 [1] 和 [2] 解决了类型 trôi nổi 的问题和 gấp đôi (即,所有输出 1.5,即使有 [3] 注释),但如果可能的话,我宁愿不必列出所有可能的类型或在不使用它们的代码中为那些类型实例化模板。我希望能够在 TestStruct 中放入一些东西(或 testStruct.hpp )以保证 Dependency已为该类型实例化,而无需指定 T 可能是什么类型。

我看过C++ Static member initalization (template fun inside)How to force a static member to be initialized? .第一个很好地解释了情况,但没有为像我这样的问题提出解决方案。第二个有两个解决方案,但似乎都不适用于 GCC 4.2.1(或者我应用不正确...)。

是否有任何其他技巧或变通方法我应该尝试,或者我是否坚持使用显式实例化?

câu trả lời hay nhất

正如 cdhowie 所建议的,您可以使用静态方法来确保 TestStructDependency 之间的初始化顺序。如果您真的关心维护静态变量而不是静态方法的外观,则可以使用由静态方法调用初始化的静态引用变量。

您只需要确保您的静态方法实现本身不使用静态引用变量,以便在全局初始化上下文期间可以安全地调用它们。

template 
struct Dependency {
Dependency() {}
Dependency(T v) : var(v) {}
static const Dependency & staticMethod () {
static const Dependency staticMethodVar(1.5);
return staticMethodVar;
}
static const Dependency & staticVar;
T var;
};

template
const Dependency & Dependency::staticVar
= Dependency::staticMethod();

template
struct TestStruct {
TestStruct(Dependency v) : var(v.var) {}
static const TestStruct & staticMethod () {
static const TestStruct staticMethodVar(Dependency::staticMethod());
return staticMethodVar;
}
static const TestStruct & staticVar;
T var;
};

template
const TestStruct & TestStruct::staticVar
= TestStruct::staticMethod();

关于c++ - 如何保证模板结构中 const 静态成员的初始化顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11234862/

25 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress