はじめに
C++の新しい規格「C++0x」では、言語とライブラリの両面から便利な機能が追加されます。「TR1」(Technical Report 1)はC++0xのライブラリ部で、標準C++に新たに追加されるライブラリの多くはBoostの中から選ばれたものです。2008年春にリリースが予定されているVisual Studio 2008にも追加パッケージとして供給されるとの情報を得ています。
TR1に収録されたクラス/関数の中からいくつかをピックアップし、その概要と使い方を予習しておきましょう。第3回はtupleです。
これまでの記事
- 第1回:BoostでC++0xのライブラリ「TR1」を先取りしよう arrayとshared_ptr/weak_ptr
- 第2回:BoostでC++0xのライブラリ「TR1」を先取りしよう 正規表現「regex」
tuple(1/2)
標準C++ライブラリには二つの要素を持つ構造体:pair
が定義されています。
#include <iostream> #include <string> #include <utility> // pair using namespace std; int main() { const int N = 3; pair<string,int> phone[N]; phone[0] = pair<string,int>("警察", 110); // 代入-1 phone[1].first = "時報"; // 代入-2 phone[1].second = 117; phone[2] = make_pair("消防", 119); // 代入3 phone[0].swap(phone[2]); // 交換 for ( int i = 0; i < N; ++i ) { cout << phone[i].first << ':' << phone[i].second << endl; } }
消防:119 時報:117 警察:110
pairが組にできる要素数は2に限られるため、それ以上の要素数をまとめるのは少なからずやっかいです。
#include <iostream> #include <string> #include <utility> // pair using namespace std; // pair<string,string> と string の pair struct musician : pair<pair<string,string>,string> { typedef pair<pair<string,string>,string> base; musician(string f, string m, string l) : base(make_pair(f,m),l) {} }; ostream& operator<<(ostream& stream, const musician& m) { return stream << m.first.first << ' ' << m.first.second << ' ' << m.second; } int main() { musician wam("Wolfgang","Amadeus","Mozart"); musician jsb("Johann","Sebastian","Bach"); cout << wam << endl << jsb << endl; }
Wolfgang Amadeus Mozart Johann Sebastian Bach
TR1で提供されるtuple
は二つ組であるpair
を拡張し、任意のN個の要素を組にできます(Nは実装依存、boost1.34.1では最大9個でした)。
#include <iostream> #include <string> #include <boost/tr1/tuple.hpp> // tuple using namespace std; struct musician : tr1::tuple<string,string,string> { typedef tr1::tuple<string,string,string> base; musician(string f, string m, string l) : base(f,m,l) {} }; ostream& operator<<(ostream& stream, const musician& m) { return stream << tr1::get<0>(m) << ' ' << tr1::get<1>(m) << ' ' << tr1::get<2>(m); } int main() { musician wam("Wolfgang","Amadeus","Mozart"); musician jsb("Johann","Sebastian","Bach"); cout << wam << endl << jsb << endl; }