Tôi đang sử dụng chức năng mẫu để xây dựng đối tượng để tạo đối tượng từ dữ liệu phản chiếu và hoạt động khá tốt, nhưng bây giờ tôi muốn hỗ trợ loại vùng chứa STL trong hệ thống phản chiếu sao cho các đối tượng như:C++ Nhận loại Vector
// Note - test case only
// for real world usage it would probably not be structured like this
// and the phrases would be mapped by an id or something
struct Phrases {
std::vector<std::string> phrases;
};
typedef std::string Lang;
struct Langs {
std::map< Lang, Phrases > translations;
};
Có thể được hỗ trợ. Tôi có thể thực hiện một số phép thuật regex trên sự trở lại của
typeid(object).name()
để tìm hiểu xem đối tượng là một vectơ hoặc bản đồ và đối số tham số cho đối tượng là gì. Và tôi đã thử một số mẫu ma thuật để làm điều gì đó như sau, trong đó CreateString, ConstructString & DestroyString đang đứng trong các hàm và dữ liệu cũng phù hợp với điều gì đó phức tạp hơn một chút sử dụng cơ sở dữ liệu kiểu để xử lý đối tượng.
// Representational of code, basically a copy-paste to a different test project where I can work out the problems with this specific vector problem
// Vector specialised construction
template <typename T> void ConstructVector(void* object, const std::vector<std::string>& data) {
T* vec = (T*)object;
Name vector_type = GetVectorTypeName<T>();
void *obj;
CreateString(&obj);
// All fields in this type should be valid objects for this vector
for(std::vector<std::string>::const_iterator it = data.begin(), end = data.end(); it != end; ++it) {
// Push it
vec->push_back(*obj);
// Get address to new instance
void *newly = &vec->back();
ConstructString(newly,*it);
}
DestroyString(&obj);
}
Điều này không hoạt động do việc bỏ qua bất hợp pháp với "vec-> push_back (* obj);" mà tôi không thể làm được vì tôi không biết loại đó. Về cơ bản những gì tôi cần để có thể làm là tạo ra vectơ này với một số phần tử chưa được đặt sẵn trong nó, hoặc thêm các phần tử mới vào nó mà không thực sự có kiểu, bởi vì nếu tôi có thể lấy một con trỏ tới khối bộ nhớ bên trong vectơ, tôi có thể cuộn với điều đó và xây dựng đối tượng. Nhưng vector thêm các yêu cầu như
vector::push_back(T& value)
hoặc
vector::insert(Iter&, T&)
sẽ không làm việc cho tôi, trừ khi tôi có thể có được bàn tay của tôi trên kiểu T từ bên trong mẫu
pastebin mã kiểm tra để thử và giải quyết vấn đề này: http://pastebin.com/1ZAw1VXg
Vì vậy, câu hỏi của tôi là, làm cách nào tôi có thể nhận phần std :: string của std :: khai báo vector khi tôi ở trong một mẫu như
template <typename T> void SomeFunc() {
// Need to get std::string here somehow
// Alternatively need to make the vector a certain size and then
// get pointers to it's members so I can construct them
}
SomeFunc<std::vector<std::string>>>();
Lệnh 'std :: vector' có một 'typedef T value_type' bên trong nếu đó là những gì bạn cần. –