Подтвердить что ты не робот

Как я могу эмулировать деструктурирование в С++?

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

В 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 + '!')

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

4b9b3361

Ответ 1

Для конкретного случая объектов std::tuple (или std::pair) С++ предлагает функцию 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;

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

Ответ 2

В С++ 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";
}

Ответ 3

В основном там 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;
}

Ответ 4

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

var {species, sound} = animal

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

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

Ответ 5

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

#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.