2011-07-25 3 views
9

を持つクラステンプレート用ブラケットを回避私はその下に次のものと類似のクラステンプレートを持っているが、CSVファイルを解析するときに使用されるいくつかの構成設定を含むように設計されていますデフォルトパラメータ

template <typename InputIterator = default_all> 
class icsv_params 
{ 
    // Iterator to a data structure containing the columns 
    // that should be read. 
    typedef InputIterator iterator; 
    // This is a bitmask type. 
    typedef detail::icsv_op icsv_op; 

    static const icsv_op noqt = icsv_op(detail::csv_flags::noqt); 
    static const icsv_op quot = icsv_op(detail::csv_flags::quot); 
    static const icsv_op mmap = icsv_op(detail::csv_flags::mmap); 

    // The rest of the class definition isn't relevant. 
}; 

、テンプレートパラメータでありますユーザが解析されるべき列の番号を含むデータ構造に開始および終了イテレータを供給したい場合に重要である。ただし、ユーザーがイテレータをパラメータとして指定しなければ、クラスは自動的にすべての列を解析する必要があります。第2のケースで

、クラスのインスタンスを宣言するためのコードは、扱いにくくなります。さらに

icsv_params<> params(...); 

、ビットマスクタイプnoqtquot、それは理にかなっているようmmapは、唯一のこのクラスで使用されていますそれらをクラス定義の中に入れる。ユーザーが存在しないことを示すために、角括弧を提供する必要がないように

icsv_params<> params(icsv_params<>::noqt); 

がどのように私はそれを行うことができます。ただし、ユーザーは、そうするためのコードも扱いにくいこれらのビットマスク型を使用したいはずですテンプレートパラメータ?そうする方法がない場合は、どのような選択肢を提案しますか?

+1

関数テンプレートは、ブラケットを必要としません。 C++ 0xを仮定すると、ユーザコードは 'auto params = some_factory_function(...);'を実行できます。 –

答えて

4

残念ながら、これはC++構文です。 IIRC、C++ 0xには、関連する名前空間(2番目の質問を解決する)があります。 typedefがすべき最初のものについては、

STLà:

template <typename InputIterator = default_all> 
class basic_icsv_params 
{ 
    ... 
}; 

typedef basic_icsv_params<> icsv_params: 
+0

答えをありがとう!これは、テンプレートパラメータを提供するときにユーザが 'basic_'接頭辞をタイプしなければならないので、私の胃の中ではまだ不満を感じています。これまでのところ、GCCとIMB C++だけがこの機能をサポートしています。(うまくいけば、この機能は他のメジャーなコンパイラで素早く実装されているはずです –

+1

@ void-pointer:これは標準ライブラリの仕組みです。 'std :: basic_string 、Allocator = std :: allocator >'のために。 –

0

通常、反復子パラメータの場合、反復子型は、反復子型を必要とする関数のみのテンプレートパラメータです。たとえば、std::vectorコンストラクタを見ると、begin()とend()イテレータでテンプレート化されていますが、全体の型ではありません。

+0

OPのクラスは何らかの種類のtraitsクラスである可能性があり、実際にはiterator型がテンプレートパラメータとして必要になることがあります。 –

+0

私はそれについて考えましたが、これはクラス定義の残りの部分が関係するところです:ユーザがイテレータの型を提供すれば、クラスはそのイテレータ型のインスタンスを格納する必要があります。 CSVファイルは後でそれらを取得できます。この制限を受けることはできますか? –

0

私の意見で角かっこを置く方が実際には良い方法です。彼らは生まれることができないので、別の方法があります。

typedef icsv_params<> icsv_params_default; 
関連する問題