スポンサーサイト例外を使わないテンプレートライブラリ

Home > ----- / スポンサー広告 > This Entry 2008-08 / NTTL > This Entry [com : 2][Tb : 0]

--------

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2008-08-26

以前から例外を使わない場合の話をときどきしていました。今回、あらためて標準C++ライブラリを例外を使わずに再設計する話をしてみたいと思います。処理系によっては、実際にそのようなライブラリを提供しているものもあるようですが、今回はそれらとは無関係です。また、ここで書くのはあくまでもアイデアレベルですので、完成度は期待しないでください。

まずはライブラリの名前を決めましょう。ここは安直に、no-throw template libraryということでNTTLということにしたいと思います。ライブラリの名前空間も nttl にしましょう。NTTLでは、文字列、コンテナ、アルゴリズムを中心に考えていきたいと思います。

例外がない場合に一番困るのは、コンストラクタで失敗した場合の扱いです。これまでも何度かその話題を採り上げてきました。新規にクラスを設計する場合だけを考えれば楽ですが、既存のクラスも含めて共通に扱えるようにするには、選択肢は限られてきます。

しかたがないので、非メンバ関数 nttl::bad を定義することにします。この関数にオブジェクトを渡せば、問題がなければゼロを、問題がある場合はゼロ以外のエラーコードを返すことにします。このとき、-1 は一般的なエラーということにし、何か分からないけれど、とりあえずエラーということにしましょう。

既存のクラスで、メンバ関数やデータメンバ、あるいは他の方法で判定を行うものについては、nttl::bad 関数を多重定義することにします。例えば、

namespace nttl {
  int bad(Foo const& foo)
  {
    return return foo.good() ? 0 : -1;
  }
}

のようにすれば、既存のクラスに対しても同じシンタックスで判定を行うことができるようになります。また、nttl::bad を定義していないクラスに対しては、安全な側にたおす意味でも、とりあえず -1 を返すようにしておきます。

namespace nttl {
  template <typename T>
  int bad(T const&)
  {
    return -1;
  }
}

ただし、スカラー型についてはこの限りではありませんので、ゼロを返すように特殊化しておきましょう。ポインタ型については、

namespace nttl {
  template <typename T>
  int bad(T* ptr)
  {
    return ptr != NULL ? 0 : -1;
  }
}

とします。NULL であれば -1 を返すことにしておきます。汎整数型と浮動小数点型は、それぞれ個別に多重定義した方がよいでしょう。問題は列挙型です。ある型が列挙型であるかどうかの判別は容易ではありませんが、クラスでも組み込み型でもポインタ型でも参照型でも不完全型でもないことを調べればどうにかなることでしょう。

TR1ライブラリが使える状況であれば、std::tr1::is_enum を使うという手もありますし、そうでなければ boost::is_enum を参考に自力で実装することになりそうです。この判定はかなり処理系にも依存しますので、具体的なコードを書くのはひかえることにします。

次回は、関数の返却値を採り上げることにします。例外が使えないので、何らかの形で失敗を呼び出し元に通知する必要があるわけですが、その方法を考えてみます。

Comment

う~ : 2008-08-29(Fri) 11:58 URL edit
> ただし、スカラー型についてはこの限りではありませんので、ゼロを返すように特殊化しておきましょう。

こういうのでもよいかと…

namespace nttl {
template <typename T>
int bad(T const&, typename enable_if<is_scalar<T>::value>::type* = 0)
{
return 0;
}
template <typename T>
int bad(T const&, typename disable_if<is_scalar<T>::value>::type* = 0)
{
return -1;
}
}

きっと、enable_if や is_scalar は自力で実装でしょうねw
たかぎ : 2008-08-29(Fri) 20:18 URL edit
う~さん、コメントありがとうございます。

標準準拠度の低い処理系もあるので、可能な限り愚直な実装の方が無難ということもあります。
どっちにしても、is_scalarなんかは必要な気がするので、自作は避けられないでしょうね。
Post a Comment









管理者にだけ表示を許可

Trackback

http://cppemb.blog17.fc2.com/tb.php/111-a090b3d3

C++と組み込み環境 | Page Top▲

New >>
返却値の扱い
<< old
組込みプレス Vol.12 特集1に対して重箱の隅をつつく
ブログ内検索
RSSフィード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。