Enviado em 08/01/2018 - 14:40h
Gostaria de saber como faço para criar um array estilo C ou um vector de **objetos diferentes** em C++?
Enviado em 08/01/2018 - 14:40h
Enviado em 08/01/2018 - 16:32h
Enviado em 08/01/2018 - 17:24h
void *array_generico[10];No código acima, cabe a você lembrar o tipo de cada elemento, bem como se ele deve ou não ser desalocado no momento em que o array ou vetor não for mais necessário.
std::vector<void *> vetor_generico;
vetor_generico.push_back(const_cast<char *>("Paulo")); // Aponta para uma constante do programa (depois de desconsiderar o atributo constante).
vetor_generico.push_back(new int(1205)); // Aloca novo inteiro e lhe atribui o valor 1205.
vetor_generico.push_back(array_generico); // Pega o endereço do array (que coincide numericamente com o endereço do primeiro elemento).
for(int n=0; n<std::min(10, vetor_generico.size()); n++){
array_generico[n]=vetor_generico[n]; // ATENÇÃO: Os elementos do vetor e do array apontam para os mesmos dados!
}
std::cout << *static_cast<char *>(vetor_generico[0]) << '\n'; // OK: o tipo do elemento realmente é um array de caracteres que aponta para uma string.
std::cout << *array_generico[1] << '\n'; // ERRO: não posso derreferenciar um ponteiro para void.
std::cout << *static_cast<int *>(vetor_generico[2]) << '\n'; // ALERTA: Funciona, mas pode não fazer sentido, especialmente se sizeof(void *)<sizeof(int).
Enviado em 08/01/2018 - 19:06h
C++17 tem bastante coisa nova que é interessante, vale a pena dar uma olhada...
// g++ -o teste teste.cpp -Wall -O2 -std=c++17
#include <iostream>
#include <vector>
#include <any>
#include <string>
using namespace std;
int main()
{
int a = 10;
float b = 3.14;
bool c = true;
string d = "Hello World!";
vector<any> vec {a, b, c, d}; // este vector<any> contém int, float, bool e string !!!
for (auto& elem: vec) { // print o tipo de elem (i = integer, f = float, b = bool)
cout << elem.type().name() << endl;
}
cout << endl;
// para acessar o elemento use any_cast
cout << any_cast<int>(vec[0]) << endl;
cout << any_cast<float>(vec[1]) << endl;
cout << boolalpha << any_cast<bool>(vec[2]) << endl;
cout << any_cast<string>(vec[3]) << endl;
return 0;
}
Enviado em 08/01/2018 - 20:36h
std::variant também veio no C++17
// g++ -o teste teste.cpp -Wall -O2 -std=c++17
#include <iostream>
#include <vector>
#include <string>
#include <variant>
using namespace std;
int main()
{
int a = 10;
float b = 3.14;
string c = "Hello World!";
using cont = variant<int, float, string>;
vector<cont> vec {a, b, c}; // esse vector contém int, float e string
for (auto& elem: vec) {
// testa o tipo de cada elemento e imprime
if (holds_alternative<int>(elem)) {
cout << get<int>(elem) << endl;
}
else if (holds_alternative<float>(elem)) {
cout << get<float>(elem) << endl;
}
else if (holds_alternative<string>(elem)) {
cout << get<string>(elem) << endl;
}
}
return 0;
}
Enviado em 08/01/2018 - 20:41h
int i = 5;
void* p = &i;
static_cast<double*>(p); //Compiler doesn't complain. Undefined Behavior.
std::any a;
a = i;
std::any_cast<double>(a); //throws, which is good
Enviado em 09/01/2018 - 02:17h
Entre na sua conta para responder.