| 定義済みアクション |
![]() |
![]() |
![]() |
フレームワークは二つの定義済みセマンティックアクションを持っている。 経験的にこれらのファンクタはとてもよく用いられるので、 ユーザが同様の機能を繰り返し再発明する必要がないように コアフレームワークの一部に含んでいる。
パーサによって渡された値を変数 v に代入する。
使い方の例:
int i;
std::string s;
r = int_p[assign(i)] >> (+alpha_p)[assign(s)];
入力として 123456 "Hello" が与えられたとすると、 assign(i) は数値 123456 を取り出し、 i へ代入する。 それから、 assign(s) が文字列 "Hello" を取り出し、 それを s に代入する。 技術的には、式 assign(v) はセマンティックアクションを生成するテンプレート関数である。 生成されたセマンティックアクションはポリモーフィックであり、 パーサから受け取った引数と互換性がある限りあらゆる型とともに動作すべきである。 これは明白ではないだろうが、文字列はイテレータ first と last 引数を 受け付けることができる。これらはジェネリックなセマンティックアクション(上述)へと渡される。 実は assign(first, last) メンバ関数を持つあらゆる STL コンテナが利用できる。
ユーザが独自のセマンティックアクションファンクタを書く際の参考と手助けの為に、 assign(v) アクションの実装は以下に示す。 これは理解するのに十分なほど小さくてシンプルなのでここに含めている。
assign_actor クラス
template <typename T>
class assign_actor
{
public:
explicit
assign_actor(T& ref_)
: ref(ref_) {}
template <typename T2>
void operator()(T2 const& val) const
{ ref = val; }
template <typename IteratorT>
void
operator()(IteratorT const& first, IteratorT const& last) const
{ ref.assign(first, last); }
private:
T& ref;
};
assign 関数
template <typename T>
inline assign_actor<T> const
assign(T& t)
{
return assign_actor<T>(t);
}
パーサから渡された値をコンテナ c へ追加する。
使い方の例:
std::vector<int> v;
r = int_p[append(v)] >> *(',' >> int_p[append(v)]);
上記のコードはコンマで区切られた整数のリストをパースし、その数をベクタ v に追加する。 append(c) はパースされた値(パーサによってセマンティックアクションに渡された引数)をコンテナ c に追加する。 このコンテナは insert(where, value) メンバ関数および end() メンバ関数を持っていなければならない。 手短に言えば、 STL コンテナは append(c) が動作する完璧な候補である。 assign(v) と同様に append(c) はイテレータの組を取ることができる。 この場合、コンテナは二つのメンバ関数 insert(where, first, last) と end() を持っていなければならない。 例、 std::vector<std::string> など。
![]() |
![]() |
![]() |
Copyright © 1998-2003 Joel de Guzman
Permission to copy, use, modify, sell and distribute this document
is granted provided this copyright notice appears in all copies. This document
is provided "as is" without express or implied warranty, and with
no claim as to its suitability for any purpose.
Japanese Translation Copyright © 2003 Kent.N
オリジナルの、及びこの著作権表示が全ての複製の中に現れる限り、この文書の複製、利用、変更、販売そして配布を認める。このドキュメントは「あるがまま」に提供されており、いかなる明示的、暗黙的保証も行わない。また、いかなる目的に対しても、その利用が適していることを関知しない。
このドキュメントの対象: Boost Version 1.30.0
最新版ドキュメント(英語)