2010-11-06-01-文字コードの話 - 10 - project-enigma

2010-11-06-01-文字コードの話 - 10

>> Site top >> weblog >> 月別アーカイブ >> 2010年11月のlog >> 2010-11-06-01-文字コードの話 - 10

最終更新日付:2013/12/31 07:35:53


文字コードの話 - 10

2010 年 11 月 06 日

前回、適切なリファレンスを返すことができない問題について書いた。今回は、その解決法について。

一般に、型 T の要素を保持するコンテナの反復子は、operator* が T& を返すのが一番単純な実装だ。つまり、こういうことだ。無論詳細は割愛している。

template<typename T>
class SomeContainer {
        //  :
        //  :
public:
    class iterator {
    public:
        inline T& operator*( );
        //  :
        //  :
    };
};

問題は、なんらかの事情でリファレンスが返せない場合である。このような場合に有効なのは、リファレンスのかわりになるオブジェクトを返却することだ。つまり、以下のように。

template<typename T>
class SomeContainer {
public:
    class RefType {
    public:
        inline operator T( ) const;
        inline RefType& operator=( T value );
        //  :
        //  :
    };
public:
    class iterator {
    public:
        inline RefType operator*( );
        //  :
        //  :
    };
};

こうしておけば、operator* が返す RefType 型の一時オブジェクトを介して取得も設定もできるようになる。エンコーディング処理の実装では、上の RefType は char* ポインタを保持し、operator= において与えられた文字値を適切なかたちで現在のアドレス付近に配置することになる。

このテクニックをどこで最初に学んだのか、正直思い出せないが、C++ 標準ライブラリの bitset テンプレートで使っていたのを見たような気がする。いずれにせよ、目から鱗が落ちるような思いがしたものだ。

ちなみに、このテクニックは別の使い途もある。リファレンスを直接的に返却する場合、設定される値をチェックすることができないが、このテクニックを使えばチェックを実装できるようになるのだ。それはそれで、大きな価値があると言える。

ひとまずのところ、この方針で試験的な実装を進めている。経過は良好だったが、今日になって別の問題が持ち上がった。しかしそれについてはまた次回にしよう。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : 開発

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.