如何在C ++中模拟解构?

时间:2015-07-13 22:22:37

标签: javascript c++ destructuring c++17 language-construct

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

我可以在C ++中做些什么来获得类似的语法并模拟这种功能?

5 个答案:

答案 0 :(得分:36)

对于std::tuple(或std::pair)个对象的特定情况,C ++提供了类似的WinDbg函数:

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;

我完全没有像你提出的那样了解符号的方法。

答案 1 :(得分:28)

在C ++ 17中,这称为structured bindings,它允许以下内容:

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

答案 2 :(得分:6)

主要是std::mapstd::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;
}

答案 3 :(得分:2)

我担心你不能像以前那样习惯JavaScript(顺便说一下,似乎是new technology in JS)。原因是在C ++中,您无法像在

中那样分配给结构/对象/赋值表达式中的多个变量
var {species, sound} = animal

然后使用speciessound作为简单变量。目前C ++根本没有这个功能。

您可以在重载其赋值运算符时分配给结构和/或对象,但我没有看到如何模拟该确切行为的方式(截至今天)。考虑提供类似解决方案的其他答案;也许这适合你的要求。

答案 4 :(得分: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);

产生foobar的局部变量。

当然,它仅限于创建所有相同类型的变量,但我想您可以使用auto来解决这个问题。

那个宏仅限于做两个变量。所以你必须创建DESTRUCTURE3,DESTRUCTURE4等,以覆盖你想要的任意数量。

我个人并不喜欢最终的代码风格,但它与JavaScript功能的某些方面相当接近。