2012-02-27 26 views
6

Tôi đang tự hỏi giải pháp chuyên nghiệp hơn cho một vấn đề. Tôi đang làm việc trên C++ SOAP2 solution.I có một defintion Strcut khoảng 25 yếu tốC++ Cấu trúc: nhận thuộc tính theo tên

struct X { field 1; field 2; .. };  

và tôi Tring để điền vào nó với một số đồ giá trị

Map<String,String> A  

và nó xuất hiện rất phiền lòng khi làm điều đó n lần

X->xx = A["aaa"]  

mỗi lần tôi muốn điền vào cấu trúc thư SOAP của mình.

Câu hỏi: Có thể gọi phần tử struct theo tên không? * Ví dụ: để được abe để xử lý như thế này:

X->get_instance_of("xx").set(A["aaa"]);  

và đặt nó vào một vòng lặp .. *

Cảm ơn,

+0

Có phải tất cả các thành viên cùng loại không? – dasblinkenlight

+0

lặp qua những gì? Giải pháp sẽ là thiết lập một số ràng buộc, nhưng rất khó để biết là bạn chưa cung cấp đủ thông tin. – CashCow

+0

Cấu trúc luôn giống nhau? Và .. các trường có giống nhau không? –

Trả lời

1

số C++ không có phản xạ. Java mặc dù vậy. Không có gì đáng ngạc nhiên khi các công cụ liên quan đến SOA có thể gặp phải nhiều ngôn ngữ như Java hơn là với các ngôn ngữ như C.

+1

Không chắc đó là sự thật. Các API SOAP trong Java tạo các trình bao bọc mã như một bước biên dịch. Tại sao không tồn tại cùng với C++? Không cần phải sử dụng sự phản chiếu cho điều đó. –

+0

Nó chắc chắn có thể được thực hiện trong C++ là tốt, với con trỏ thành viên và quá tải chức năng. – Nawaz

+0

@KonradRudolph [C++ Middleware Writer] (http://webEbenezer.net) thực hiện điều đó. –

1

Không thực sự có thể làm được điều đó; thông tin bạn cần không còn tồn tại trong thời gian chạy. Bạn có thể làm điều gì đó với một số map và một số gợi ý, nhưng thành thật mà nói, bạn có lẽ sẽ tốt hơn là chỉ gói nó trong một hàm cần có một map và đặt các giá trị vào các trường thích hợp.

2

Câu trả lời ngắn gọn: không. Đây là C++, một ngôn ngữ được biên dịch tĩnh, trong đó các tên thành viên cấu trúc được chuyển đổi bởi trình biên dịch thành các offset bộ nhớ. Nó không phải là động như PHP hay Python, nơi mà thời gian chạy được tham gia với tất cả các tham chiếu biến.

8

C++ thiếu tích hợp phản ánh khả năng của nhiều ngôn ngữ động hơn, do đó bạn không thể làm những gì bạn muốn bằng cách sử dụng khả năng của ngôn ngữ đó.

Tuy nhiên, nếu tất cả các thành viên là cùng loại, bạn có thể làm điều đó với một bản đồ của các con trỏ tới các thành viên và một chút chuẩn bị:

// typedef for the pointer-to-member 
typedef int X::*ptr_attr; 

// Declare the map of pointers to members 
map<string,ptr_attr> mattr; 
// Add pointers to individual members one by one: 
mattr["xx"] = &X::xx; 
mattr["yy"] = &X::yy; 

// Now that you have an instance of x... 
X x; 
// you can access its members by pointers using the syntax below: 
x.*mattr["xx"] = A["aa"]; 
+2

Ngay cả khi chúng là các loại khác nhau, nó có thể được thực hiện với quá tải chức năng. – Nawaz

+0

@Nawaz Chắc chắn, nhưng điều đó đòi hỏi một giải pháp hoàn toàn khác.Hơn nữa, rất có khả năng giải pháp đó sẽ thanh lịch hơn so với giải pháp tôi đề xuất. – dasblinkenlight

+0

Có. Một giải pháp như vậy được đưa ra bởi [@Johannes Schaub] (http://stackoverflow.com/users/34509/johannes-schaub-litb) tại đây: http://stackoverflow.com/a/287353/415784 – Nawaz

0

Bạn có thể tạo một Objet wrapper cho struct của bạn với bộ/có được accessors sẽ cho phép bạn lặp qua các giá trị chuỗi để điền/đọc cấu trúc cơ bản đó là tĩnh.

Các vấn đề liên quan