CodeZine(コードジン)

特集ページ一覧

BoostでC++0xのライブラリ「TR1」を先取りしよう (3)

N個以上の要素をまとめられる「tuple」

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2008/02/04 14:00

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です。

これまでの記事

 BoostのインストールについてはBoostでC++0xのライブラリ「TR1」を先取りしよう(1)をご覧ください。
 2008年1月現在、Visual C++ 2008 Feature Pack Betaおよびそのドキュメントが公開されています。Feature PackはMFCの追加機能とTR1をサポートするライブラリのパッチです。現Betaの段階ではVisual Studio 2008の英語版にのみ対応しています。

tuple(1/2)

 標準C++ライブラリには二つの要素を持つ構造体:pairが定義されています。

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に限られるため、それ以上の要素数をまとめるのは少なからずやっかいです。

pairでむりやり3要素
#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個でした)。

tr1::tuple版'音楽家'
#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;
}

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • επιστημη(エピステーメー)

    C++に首まで浸かったプログラマ。 Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"り わんくま同盟でたまにセッションスピーカやったり 中国茶淹れてにわか茶人を気取ってたり、 あと Facebook とか。 著書: - STL標準...

バックナンバー

連載:BoostでC++0xのライブラリ「TR1」を先取りしよう
All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5