Как я могу эмулировать деструктуризацию в C ++?

В JavaScript ES6 есть функция языка, известная как деструктурирующий. Он существует и во многих других языках.

В JavaScript ES6 это выглядит так:

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

//Destructuring
var {species, sound} = animal

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

Что я могу сделать в C ++, чтобы получить аналогичный синтаксис и эмулировать такую ​​функциональность?

32

Решение

Для конкретного случая std::tuple (или же std::pair), C ++ предлагает std::tie функция, которая выглядит аналогично:

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;

Я не знаю подход к обозначению точно так, как вы его представляете.

34

Другие решения

В C ++ 17 это называется структурированные привязки, что позволяет следующее:

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";
}
24

В основном там с std::map а также 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

Боюсь, что у вас не может быть так, как вы привыкли в JavaScript (что, кстати, кажется, новая технология в JS). Причина в том, что в C ++ вы просто не можете присваивать нескольким переменным в выражении структуры / объекта / присваивания, как вы это делали в

var {species, sound} = animal

а затем использовать species а также sound как просто переменные. В настоящее время C ++ просто не имеет этой функции.

Вы можете присваивать структурам и / или объектам, перегружая их оператор присваивания, но я не вижу способа, как вы могли бы подражать этому точному поведению (на сегодняшний день). Рассмотрим другие ответы, предлагающие аналогичные решения; Может быть, это работает для вашего требования.

2

Другая возможность может быть сделана как

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

который будет использоваться как:

struct Example
{
int foo;
int bar;
};

Example testObject;

int DESTRUCTURE2(foo, bar, testObject);

давая локальные переменные foo а также bar,

Конечно, это ограничено созданием переменных одного типа, хотя я полагаю, вы могли бы использовать auto чтобы обойти это.

И этот макрос ограничен двумя переменными. Таким образом, вам придется создать DESTRUCTURE3, DESTRUCTURE4 и так далее, чтобы покрыть столько, сколько вы хотите.

Лично мне не нравится стиль кода, которым он заканчивается, но он достаточно близок к некоторым аспектам функции JavaScript.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector