2011-11-11 19 views
3

型が文字列を表すことができるかどうかをテストするために、既存の(標準ライブラリまたはBoostの)型特性がありますか?文字列の型特性

Boost.Fusionを使用したとき、私は問題につまずい:

auto number = fusion::make_vector(1, "one"); 
auto numberName = fusion::filter< char const * >(number); 

assert(numberName == fusion::make_vector("one")); // fails 

私はfilterは「1」を維持することを望んだが、「1」は、ポインタに減衰されていないため、それが失敗した(make_vectorをすることによって、その引数を取りますしたがって、タイプはconst char (&)[4]です)。その結果、私は私がこのような何かを書くことができるようになる形質を必要とする:

auto numberName = fusion::filter_if< is_string<mpl::_> >(number); 

私はchar const *const char[N]は必ずしもnull終端文字列ではありませんが、まだできるようにするには便利だろうと認識していますそれらを一様に検出する。この形質は、おそらくstd::stringなどのtrueなどを返すこともできます。

このような特性が存在するのか、それとも自分で作成する必要がありますか?

+0

static_cast ( "one")はどうでしょうか?または、配列をとり、それらをポインタにキャストする一般的なテンプレートですか? –

+0

@KerrekSB:関数呼び出しですべての文字列リテラルをカプセル化することは実際の負担のようですが、関数テンプレートを使用して型がcharポインタに変換できるかどうかをテストできます。 –

+0

assert()内に閉じカレンがありません。 – semisight

答えて

6

私はこのような特性を実装する際に打撃を与えましたが、本当に堅牢であるかどうかはわかりません。任意の入力をいただければ幸いです。

template <typename T> 
struct is_string 
    : public mpl::or_< // is "or_" included in the C++11 library? 
     std::is_same<  char *, typename std::decay<T>::type >, 
     std::is_same< const char *, typename std::decay<T>::type > 
    > {}; 

assert (! is_string<int>::value); 

assert ( is_string< char  *  >::value); 
assert ( is_string< char const *  >::value); 
assert ( is_string< char  * const >::value); 
assert ( is_string< char const * const >::value); 

assert ( is_string< char  (&)[5] >::value); 
assert ( is_string< char const (&)[5] >::value); 

// We could add specializations for string classes, e.g. 
template <> 
struct is_string<std::string> : std::true_type {}; 
+4

'or_'は11に含まれていません。これと同等のものは 'std :: integral_constant となると思います。<...> :: value || std :: is_same <...> :: value> ' –

関連する問題