[英]How to access C++ struct property value using index?
struct student {
string name;
int age;
};
int main() {
student a1;
cout << a1[0] << endl; //Access the first variable of the struct
cout << a2[1] << endl; //Access the first variable of the struct
}
如何使用索引而不是使用“a1.name”從 C++ 結構訪問和檢索值?
你不能。 至少不是以你想要的直接方式去做,也沒有部分重新定義結構是什么。 我將把我的答案分成兩部分,第一部分解釋至少接近你想要的東西的可能方法,第二部分解釋你實際應該做什么:
下來和骯臟
有兩種方法(我目前可以想出)可能會讓您有所思考:
[]
運算符。 因此,如果您創建一個包含結構作為其成員的類(即它環繞結構),則可以使用[]
公開結構的數據。 這盡可能接近您想要做的事情。 然而,它確實違背了使用 struct 的全部目的,因為您可以只使用普通的非 sturct 類成員來做到這一點,但實際上我在不久前看到它,當時我正在瀏覽一個 C++ 庫,該庫包裝了以前的 C-基於自身的版本,以便提供更現代的功能,而無需完全重寫 C 代碼。替代品...
根據您提供的信息,我認為您正在尋找一種完全不同類型的數據 - 字典、地圖或列表,其中包含某種自定義通用數據容器,可以保存任何類型的數據,但也可以存儲該數據的類型以允許將其重鑄到其原始狀態。 許多庫都提供了這樣的容器,例如 Qt 有QVariant
(核心模塊的一部分), boost
有boost::variant
、 std::tuple
(甚至更好的命名元組)與標准 C++(自 C++11 起) ) 等等。 我可以更詳細地談論 Qt,因為我對它有更多的經驗。 它提供了允許索引的QVariantList
( QList<QVariant>
的typedef
)。 當然,所有這些都要求您 1) 放棄您的結構和 2) 使用一些更高級的容器,這些容器可能會或可能不會對您正在處理的任何事情帶來巨大的缺點,包括許可問題、內存開銷、更大的二進制文件、處理大量額外的庫文件等
如何使用索引訪問 C++ struct 屬性值?
你不能。 C++ 語言沒有允許這樣做的功能。 這在支持(靜態)反射的語言中是可能的。
您可以選擇使用std::tuple
代替,它允許索引成員訪問,但由於您無法命名成員,因此可讀性下降。
一種方法是從成員變量創建一個元組並使用std::tie
通過索引獲取成員。 但是,必須在編譯時知道索引。 您可以將其包裝在結構的成員函數中:
#include <tuple>
#include <iostream>
struct student {
std::string name;
int age;
template<size_t I>
auto& get() {
return std::get<I>(std::tie(name, age));
}
};
int main() {
student boy{ "Paul", 12 };
std::cout << "Name: " << boy.get<0>() << " Age: " << boy.get<1>() << std::endl;
//Change members
boy.get<0>() = "John";
boy.get<1>() = 14;
std::cout << "Name: " << boy.get<0>() << " Age: " << boy.get<1>() << std::endl;
}
(至少需要 C++14)
在 C++11 中,除非指定,否則它沒有自動返回類型推導,因此您可以使用std::tuple_element
來指定返回類型:
#include <tuple>
#include <iostream>
struct student {
std::string name;
int age;
template<size_t I>
using T = typename std::tuple_element<I, std::tuple<std::string, int>>::type;
template<size_t I>
T<I>& get()
{
return std::get<I>(std::tie(name, age));
}
};
int main() {
student boy{ "Paul", 12 };
std::cout << "Name: " << boy.get<0>() << " Age: " << boy.get<1>() << std::endl;
//Change members
boy.get<0>() = "John";
boy.get<1>() = 14;
std::cout << "Name: " << boy.get<0>() << " Age: " << boy.get<1>() << std::endl;
}
我試圖盡可能接近您的示例,但我確實必須將年齡從 int 轉換為 string。 這有效,我發現它在一個應用程序中很有用。
struct student
{
std::string name, age;
std::string *elemtnPtr[10];
student()
{
int i=0;
elemtnPtr[i++] = &name;
elemtnPtr[i++] = &age;
}
};
void demo()
{
student a1;
a1.name = "This Works";
a1.age = "99";
std::cout << *a1.elemtnPtr[0] << std::endl;
std::cout << *a1.elemtnPtr[1] << std::endl;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.