- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有两个模板结构,每个结构都包含一个常量静态成员变量。这些成员变量之一的初始化取决于第二个。因此,我希望能够保证第二个在第一个之前初始化。这是一个简化的示例:
依赖.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
也就是TestStruct
của staticVar
nếu như Dependency
则正确初始化已经为 T
类型实例化了, 但它仍然为 0,因为 Dependency
尚未初始化。取消注释 [1] 和 [2] 解决了类型 trôi nổi
的问题和 gấp đôi
(即,所有输出 1.5,即使有 [3] 注释),但如果可能的话,我宁愿不必列出所有可能的类型或在不使用它们的代码中为那些类型实例化模板。我希望能够在 TestStruct
中放入一些东西(或 testStruct.hpp
)以保证 Dependency
已为该类型实例化,而无需指定 T 可能是什么类型。
我看过C++ Static member initalization (template fun inside)Và How to force a static member to be initialized? .第一个很好地解释了情况,但没有为像我这样的问题提出解决方案。第二个有两个解决方案,但似乎都不适用于 GCC 4.2.1(或者我应用不正确...)。
是否有任何其他技巧或变通方法我应该尝试,或者我是否坚持使用显式实例化?
câu trả lời hay nhất
正如 cdhowie 所建议的,您可以使用静态方法来确保 TestStruct
Và Dependency
之间的初始化顺序。如果您真的关心维护静态变量而不是静态方法的外观,则可以使用由静态方法调用初始化的静态引用变量。
您只需要确保您的静态方法实现本身不使用静态引用变量,以便在全局初始化上下文期间可以安全地调用它们。
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/
Tôi hiện đang cố gắng xây dựng một từ điển dựa trên bảng băm. Logic là: có một cấu trúc tên là HashTable với các nội dung sau: HashFunc HashFunc; PrintFunc PrintEntry;
Nếu tôi có một con trỏ tới một cấu trúc/đối tượng và cấu trúc/đối tượng đó chứa hai con trỏ khác tới các đối tượng khác và tôi muốn xóa đối tượng chứa hai con trỏ này mà không hủy các con trỏ mà nó giữ - Tôi phải làm điều này như thế nào? Con trỏ tới đối tượng A (chứa con trỏ tới đối tượng
Mã giống như gói này main import "fmt" type Hello struct { ID int Raw string } type World []*Hell
Tôi có một tệp CSV có định dạng sau: Mô-đun, Chủ đề, Chủ đề phụ. Nó cần có khả năng được nhập vào cơ sở dữ liệu MySQL với định dạng sau: CREATE TABLE `modules` ( `id
Thông thường tôi sử dụng một cái gì đó như copy((uint8_t*)&POD, (uint8_t*)(&POD + 1 ), back_inserter(rawData)); copy((uint8_t*)&PODV
Lỗi: Việc kết hợp chỉ có thể được thực hiện trên các bảng có loại cột tương thích. cấu trúc (lớp: chuỗi, skyward_number: chuỗi, skyward_points: chuỗi) <> cấu trúc (skyward_number: chuỗi, lớp: ký tự
Tôi có một loạt các con trỏ tới các cấu trúc và tôi đang cố gắng sử dụng chúng trong vòng lặp while. Tôi không hoàn toàn tự tin về cách khởi tạo nó một cách chính xác, nhưng tôi luôn làm điều này: Entry *newEntry = malloc(sizeof(Entry)
Tôi đang học C và câu hỏi của tôi có thể ngu ngốc nhưng tôi bối rối. Trong một hàm như thế này: int afunction(somevariables) { if (someconditions)
Hiện tại tôi đang thực hiện một nhiệm vụ lập trình và tôi thực sự chưa hiểu đầy đủ về liên kết vì chúng tôi chưa đề cập đến nó. Nhưng tôi cảm thấy cần nó để làm những gì tôi muốn, vì mảng không đủ nên tôi tạo cấu trúc như sau struct node { float coef;
Cho đoạn mã sau: #include #include #define MAX_SIZE 15 typedef struct{ int touchs;
struct contact list[3]; int checknullarray() { for(int x=0;x<10;x++) { if(strlen(con
Câu hỏi này đã có câu trả lời ở đây: Đã đóng 11 năm trước. Có thể trùng lặp: Vòng lặp “for” trống trong Facebook ajax AJAX gọi gì
Tôi vừa duyệt một tệp trong bộ phản xạ và thấy điều này trong hàm tạo cấu trúc: this = new Binder.SyntaxNodeOrToken(); Ai đó có thể giải thích cách bài tập này hoạt động trong C# không?
Tôi thường sử dụng các hằng chuỗi, ví dụ: DICT_KEY1 = 'DICT_KEY1' DICT_KEY2 = 'DICT_KEY2' ... nhiều khi tôi không quan tâm các chữ thực tế là gì miễn là chúng là duy nhất và con người có thể đọc được
Tôi mới sử dụng C và tôi không hiểu tại sao đoạn mã sau không hoạt động: typedef struct{ uint8_t a; uint8_t* b;
Bạn có thể tạo một cấu trúc hoạt động giống như một trong các lớp dựng sẵn, nơi bạn có thể gán giá trị trực tiếp mà không cần gọi thuộc tính không? Tiền thân: Số lượng RoundedDouble = 5;
Đây là mã của tôi: #include typedef struct { const char *description; int age;
Tôi nghĩ R có cấu trúc đặt tên hữu ích cho các thành phần danh sách khi tạo danh sách lồng nhau. Tôi có một danh sách các danh sách và muốn áp dụng một hàm cho mọi vectơ có trong bất kỳ danh sách nào. lapply thực hiện điều này nhưng sau đó loại bỏ cấu trúc đặt tên của danh sách. Làm cách nào để áp dụng các cột lồng nhau
Tôi đang tạo một công cụ sắp xếp cá nhân cho mục đích học tập và tôi chưa bao giờ làm việc với XML nên tôi không chắc liệu giải pháp của mình có phải là giải pháp tốt nhất hay không. Đây là cấu trúc cơ bản của tệp XML tôi đính kèm:
Tôi chưa quen với khái niệm nosql nên khi bắt đầu học PouchDB, tôi đã tìm thấy bảng chuyển đổi này. Sự nhầm lẫn của tôi là, PouchDB hoạt động như thế nào nếu tôi có thể nói rằng tôi có nhiều bảng, điều đó có nghĩa là tôi cần tạo nhiều cơ sở dữ liệu? Bởi vì theo tôi trong bagdb
Tôi là một lập trình viên xuất sắc, rất giỏi!