ホーム < ゲームつくろー! < ツール編


その7 マルペケ謹製文字列ストリームクラス(v1.01)


 std::stringの文字列連結能力とstd::streamの書式付の可変長文字列生成の能力を併せ持ったクラスです。実装経緯等はC++踏み込み編その12「printfな可変長引数で文字列を返す関数」にあります。

名前 バージョン 公開日
マルペケ謹製文字列ストリーム 1.01 2009. 10.17

バージョンレポートはこちら


○ 定義

名前空間 ヘッダー
Dix DixStr.h


○ DixStrメンバメソッド

公開メンバメソッド 説明 使い方 備考
template< class T>
Str(const T& src )
Str( void )
コンストラクタ Dix::Str str;
Dix::Str str( _T("マルペケつくろ〜") );
Dix::Str str( 100 );
Dix::Str str( 200.25 );
コンストラクタの引数には文字列、数値、浮動小数点、std::string(もしくはstd::wstring)などstd::stringstreamが解釈できる型を渡す事ができます。渡した文字列はstd::stringstreamの解釈で出力される文字列として内部に格納されます。デフォルトコンストラクタの場合は空の文字列が格納されます。
const tstring &str( void ) std::string(Unicode文字セットの場合はstd::wstring)を取得 Dix::Str testStr( _T("まるぺけつくろ〜");
std::string str = testStr.str();
内部に格納されているstd::string(Unicode文字セットの場合はstd::wstring)を返します。同様の機能を提供する演算子が定義されているため、実際はこのメソッドを使用しなくても左記の代入は可能です。格納された文字列の長さなどstd::stringの機能を直接扱いたい場合に重宝します。


演算子 説明 使い方 備考
bool operator !( void ) 否定演算子 Dix::Str str(_T("ABC"));
if( !str )
  return false;
文字列が格納されていなければtureを返します。
bool operator !=( const Dix::Str &src )
bool operator !=<T>( const T &src )
比較演算子 Dix::Str str(_T("ABC"));
if ( str != _T("Test") )
  return false;
文字列の比較をし、完全一致していなければtrueが返ります。テンプレートも定義されているため右辺にstd::stringの比較対象となる物ならば置く事が可能です。
Dix::Str& operator +( const Dix::Str &src ) 加算演算子 Dix::Str str1(100);
Dix::Str str2( _T(" yen") );
std::string s( _T("です") );
Dix::Str str = str1 + str2 + s;

文字列の連結を行います。Dix::Str型、const char*型そしてstd::string型を右辺に置けます。
Dix::Str& operator+=( const Dix::Str &src ) 加算代入演算子 Dix::Str str1(100);
Dix::Str str2( _T(" yen") );
std::string s( _T("です") );
Dix::Str st1 += str2 + s;
文字列の連結と代入を行います。Dix::Str型、const char*型そしてstd::string型を右辺に置けます。
bool operator <( const Dix::Str &src ) 比較演算子 Dix::Str str1( _T("AAA") );
Dix::Str str2( _T("BBB") );
if ( str1 < str2 )
   return true;
文字列の大小比較を行います。比較結果はstd::stringのそれと同じです。
Dix::Str& operator <<( const Dix::Str &src )
Dix::Str& operator <<<T>( const T &src )
ストリーム代入演算子 Dix::Str str;
str << "This " << "is " << "a " << pen.
str << 100 << " yen. ";

Dix;;Str str2;
double val = 3.141592;
const char* c = _T(" -> Pi()");
str2 << val << c;
ストリーム文字列連結を行います。strにある文字列に対して右側に続く文字列や数値が連続的に連結されます。<<演算子はいくつでも連ねる事ができます。浮動小数点の表示精度はstd::stringstreamと同様ですが、現バージョンでは精度指定はできません。
bool operator ==( const Dix::Str &src )
bool operator ==( const T &src )
比較演算子 Dix::Str str(_T("ABC"));
if ( str == _T("ABC") )
  return true;
文字列の比較をし、完全一致していればtrueが返ります。テンプレートも定義されているため右辺にstd::stringの比較対象となる物ならば置く事が可能です。
operator bool( void )
operator const TCHAR* ( void )
operator const std::basic_string<TCHAR> (void )
型変換演算子 Dix::Str str;
if ( str ) { // false };
str = 200;
if ( str ) { // true };

printf( str );   // const char*型

std::basic_string<TCHAR> s = str;
Dix::Strをbool、const char*及びstd::string(Unicode文字セットの場合はstr::wstring)として認識させる演算子です。boolは文字列が格納されていればtrueが返ります。const char*型としても認識されるため、例えばprintfに直接Dix::Strオブジェクトを代入できます。



○ バージョンレポート

v1.00 (2009. 10. 17)
・ 初出実装。各種演算子サポート。

v1.00 -> v1.01(2009. 10. 17)
・ 加算演算子で左辺の文字列が変更されないよう仕様修正
・ boolの判定が反転していたバグを修正



@ 使い方

 基本的な使い方はstd:stringと同様ですが、数値の直接代入などもできます:

Dix::Str str1( _T("Test1") );
Dix::Str str2 = _T("Test2");
Dix::Str strVal = 100;
Dix::Str strVal2 = 123.45;

後は演算子を駆使すると色々な事ができます。文字列の連結等は+や+=演算子を用います:

Dix::Str str1( _T("Test1") );
Dix::Str str2 = _T("Test2");

Dix::Str str = str1 + str2;
str += str1 + str2;

Dix::Str str3;
str3 += _T("Test3");

またストリーム連結の機能もサポートしているため、次のようにシーケンシャルに文字列や数値を代入していけます:

Dix::Str str;
const char* ThePrice = _T("The price is ");
int price = 100;

str << "This is a pen. " << ThePrice << price << " yen." << "\n";

応用編としてID3DXFont::DrawTextメソッドに可変長で直接文字列を生成させる事ができてしまいます:

int hour = 17, minute = 42, second = 39;
pFont->DrawText(
    NULL,
    Dix::Str() << "Current time is " << hour << ":" << minute << ":" << second << ".\n",
     -1, &rect, DT_LEFT  | DT_SINGLELINE, 0xffffffff );

Dix::Strの空オブジェクトにストリーム代入させるのがポイントです。

 文字列をクリアする方法はいくつかありますが、簡単なのは空のオブジェクトを代入する方法です:

Dix::Str str = _T("Test");
str = Dix::Str();  // クリア

Dix::Str str2 = _T("Test");
str2 = _T("");  // これもクリア

 比較演算子も色々と用意されています。詳しくは上記マニュアルをご覧ください。