C++の新しい規格「C++0x」に追加予定のライブラリ群「TR1」の概要を、Boost版を使って解説します(Visual Studio 2008にも追加パッケージとして供給される予定)。第3回はちょっと(かなり?)便利な「tuple」について。
はじめに
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; }
この記事は参考になりましたか?
- BoostでC++0xのライブラリ「TR1」を先取りしよう連載記事一覧
-
- BoostでC++0xのライブラリ「TR1」を先取りしよう (5)
- BoostでC++0xのライブラリ「TR1」を先取りしよう (4)
- BoostでC++0xのライブラリ「TR1」を先取りしよう (3)
- この記事の著者
-
επιστημη(エピステーメー)
C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
