Estoy usando funciones de plantilla para la construcción de objetos para crear objetos a partir de datos de reflexión, y funciona bastante bien, pero ahora quiero admitir tipos de contenedor STL en el sistema de reflexión para objetos como:C++ Get Vector type
// 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;
};
Puede ser compatible. Puedo hacer un poco de magia de expresiones regulares en el retorno de
typeid(object).name()
de averiguar si un objeto es un vector o un mapa, y cuáles son los argumentos de los parámetros para el objeto. Y he intentado utilizar magia de plantilla para hacer algo como lo siguiente, donde CreateString, ConstructString & DestroyString están en funciones y los datos se incluyen también para algo un poco más complejo que utiliza una base de datos tipo para manejar la construcción de objetos.
// 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);
}
que no funciona debido a la indirección ilegal con "Vec-> push_back (* obj);" lo cual no puedo explicar porque en realidad no conozco el tipo. Básicamente, lo que necesito hacer es crear este vector con algunos elementos sin unir en blanco, o agregarle nuevos elementos sin tener realmente el tipo, porque si puedo obtener un puntero a un bloque de memoria dentro del vector, puedo rodar con eso y construir el objeto. Pero el vector añadir requisitos tales como
vector::push_back(T& value)
o
vector::insert(Iter&, T&)
no me va a funcionar a menos que esté en mis manos en ese tipo T desde el interior de la plantilla
Pastebin de código de prueba para tratar de resolver esto: http://pastebin.com/1ZAw1VXg
Así que mi pregunta es, ¿cómo puedo obtener la std :: string parte de una declaración std :: vector cuando estoy dentro de una plantilla como
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>>>();
El 'std :: vECTOR' tiene un 'typedef T value_type' interno si eso es lo que necesita. –