SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

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

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

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

C++の新しい規格「C++0x」に追加予定のライブラリ群「TR1」の概要を、Boost版を使って解説します(Visual Studio 2008にも追加パッケージとして供給される予定)。第3回はちょっと(かなり?)便利な「tuple」について。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 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;
}

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
tuple(2/2)

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
BoostでC++0xのライブラリ「TR1」を先取りしよう連載記事一覧

もっと読む

この記事の著者

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

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2134 2008/02/04 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング