¿Cómo puedo emular la desestructuración en C++?


En JavaScript ES6, hay una característica de lenguaje conocida como desestructuring. Existe en muchos otros idiomas.

En JavaScript ES6, se ve así:

var animal = {
    species: 'dog',
    weight: 23,
    sound: 'woof'
}

//Destructuring
var {species, sound} = animal

//The dog says woof!
console.log('The ' + species + ' says ' + sound + '!')

¿Qué puedo hacer en C++ para obtener una sintaxis similar y emular este tipo de funcionalidad?

Author: Peter Mortensen, 2015-07-14

5 answers

Para el caso específico de std::tuple (o std::pair) objetos, C++ ofrece la std::tie función que se ve similar:

std::tuple<int, bool, double> my_obj {1, false, 2.0};
// later on...
int x;
bool y;
double z;
std::tie(x, y, z) = my_obj;
// or, if we don't want all the contents:
std::tie(std::ignore, y, std::ignore) = my_obj;

No soy consciente de un enfoque de la notación exactamente como usted la presenta.

 33
Author: Escualo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-13 22:39:39

En C++17 esto se llama enlaces estructurados , lo que permite lo siguiente:

struct animal {
    std::string species;
    int weight;
    std::string sound;
};

int main()
{
  auto pluto = animal { "dog", 23, "woof" };

  auto [ species, weight, sound ] = pluto;

  std::cout << "species=" << species << " weight=" << weight << " sound=" << sound << "\n";
}
 23
Author: dalle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-01 15:10:43

Sobre todo allí con std::map y std::tie:

#include <iostream>
#include <tuple>
#include <map>
using namespace std;

// an abstact object consisting of key-value pairs
struct thing
{
    std::map<std::string, std::string> kv;
};


int main()
{
    thing animal;
    animal.kv["species"] = "dog";
    animal.kv["sound"] = "woof";

    auto species = std::tie(animal.kv["species"], animal.kv["sound"]);

    std::cout << "The " << std::get<0>(species) << " says " << std::get<1>(species) << '\n';

    return 0;
}
 6
Author: Chad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-13 22:39:34

Me temo que no puede tenerlo de la manera que está acostumbrado en JavaScript (que por cierto parece ser nueva tecnología en JS). La razón es que en C++ simplemente no se puede asignar a múltiples variables dentro de una expresión de estructura/objeto/asignación como lo hizo en

var {species, sound} = animal

Y luego use species y sound como variables simples. Actualmente C++ simplemente no tiene esa característica.

Puede asignar a estructuras y / u objetos mientras sobrecarga su asignación operador, pero no veo una manera de cómo podría emular ese comportamiento exacto (a partir de hoy). Considere las otras respuestas que ofrecen soluciones similares; tal vez eso funcione para su requerimiento.

 2
Author: Ely,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-14 14:12:46

Otra posibilidad podría hacerse como

#define DESTRUCTURE2(var1, var2, object) var1(object.var1), var2(object.var2)

Que se usaría como:

struct Example
{
    int foo;
    int bar;
};

Example testObject;

int DESTRUCTURE2(foo, bar, testObject);

Obteniendo variables locales de foo y bar.

Por supuesto, se limita a crear variables del mismo tipo, aunque supongo que podría usar auto para evitar eso.

Y esa macro se limita a hacer exactamente dos variables. Así que tendrías que crear DESTRUCTURE3, DESTRUCTURE4, y así sucesivamente para cubrir tantos como quieras.

Personalmente no me gusta el código estilo esto termina con, pero viene razonablemente cerca de algunos de los aspectos de la función de JavaScript.

 1
Author: TheUndeadFish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-16 07:31:19