c – 为字符串输入特征

是否存在(在标准库中或在Boost中)类型特征来测试类型是否可以表示字符串?

我在使用Boost.Fusion时偶然发现了一个问题:

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

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

我希望过滤器会保留“one”,但它失败了,因为“one”没有衰减到指针(make_vector通过引用获取它的参数,所以类型是const char(&)[4]).因此,我需要一个特性,允许我写这样的东西:

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

我知道char const *和const char [N]不一定是以null结尾的字符串,但是能够统一检测它们仍然很方便.对于std :: string等,特征也可能返回true.

这样的特质是存在还是我必须自己编写?

解决方法:

我尝试了实现这样的特性,但我不确定它是否真的很强大.任何输入将不胜感激.

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 {};
上一篇:如何在PHP中调用“父”特征方法?


下一篇:php – 如何(以及在​​何处)在Laravel中注册自定义查询方法