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++で同様の構文を取得し、この種の機能をエミュレートするにはどうすればよいですか?
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;
あなたが提示したとおりの表記法へのアプローチを私は知りません。
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";
}
主に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;
}
私はあなたがJavaScriptで慣れている方法でそれをすることはできないと思います(ところで、それは JSの新しいテクノロジー のようです)。その理由は、C++では、構造/オブジェクト/割り当て式内の複数の変数に、
var {species, sound} = animal
次に、species
およびsound
をsimple変数として使用します。現在、C++にはその機能はありません。
構造体やオブジェクトに代入演算子をオーバーロードしながら代入することもできますが、その正確な動作をエミュレートする方法は(今日の時点では)わかりません。同様のソリューションを提供する他の回答を検討してください。多分それはあなたの要件にうまくいきます。
別の可能性は、
#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
を使用してそれを回避できると思います。
そして、そのマクロは正確に2つの変数を実行することに制限されています。したがって、DESTRUCTURE3、DESTRUCTURE4などを作成して、必要な数だけカバーする必要があります。
個人的には、これで終わるコードスタイルは好きではありませんが、JavaScript機能のいくつかの側面にかなり近づいています。