60

在 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++ 中做什么来获得类似的语法并模拟这种功能?

4

5 回答 5

114

在 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";
}
于 2016-12-01T15:10:43.767 回答
53

对于std::tuple(or 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;

我不知道与您呈现的符号完全一样的方法。

于 2015-07-13T22:39:39.293 回答
6

主要有std::mapand 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;
}
于 2015-07-13T22:39:34.437 回答
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 功能的某些方面相当接近。

于 2015-07-14T00:38:33.697 回答
2

恐怕您无法像在 JavaScript 中习惯的那样拥有它(顺便说一下,这似乎是JS 中的新技术)。原因是在 C++ 中,您根本无法像在

var {species, sound} = animal

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

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

于 2015-07-13T22:56:37.443 回答