Тип черта для строк - PullRequest
       7

Тип черта для строк

3 голосов
/ 11 ноября 2011

Существует ли существующая (в стандартной библиотеке или в 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 сохранит "один", но это не удалось, потому что "один" не распался на указатель (make_vector принимает свои аргументы по ссылке, поэтому тип равен const char (&)[4]).Следовательно, мне нужна особенность, которая позволила бы мне написать что-то вроде этого:

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

Я знаю, что char const * и const char[N] не обязательно являются строками с нулевым символом в конце, но это все равнобыть в состоянии обнаружить их равномерно.Эта черта также может вернуть true для std::string и лайков.

Существует ли такая черта или мне придется написать свою собственную?

1 Ответ

6 голосов
/ 11 ноября 2011

Я попытался реализовать такую ​​черту, но я не уверен, что она действительно устойчива.Любой вклад будет оценен.

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 {};
...