Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 字符串的类型特征_C++_String_C++11_Traits - Fatal编程技术网

C++ 字符串的类型特征

C++ 字符串的类型特征,c++,string,c++11,traits,C++,String,C++11,Traits,是否存在(在标准库或Boost中)现有的类型特征来测试类型是否可以表示字符串 我在使用Boost时偶然发现一个问题。Fusion: auto number = fusion::make_vector( 1, "one" ); auto numberName = fusion::filter< char const * >( number ); assert( numberName == fusion::make_vector( "one" ) ); // fails 我知道cha

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

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

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

assert( numberName == fusion::make_vector( "one" ) ); // fails
我知道
char-const*
const-char[N]
不一定是以null结尾的字符串,但是能够统一地检测它们还是很方便的。对于
std::string
等,trait也可能返回
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 {};
模板
结构是字符串
:public mpl::or::type>,
std::is_same::type>
> {};
断言(!is_string::value);
断言(是字符串::值);
断言(是字符串<字符常量*>::值);
断言(是字符串::值);
断言(是字符串<字符常量*常量>::值);
断言(是字符串::值);
断言(是字符串<字符常量(&)[5]>::值);
//我们可以为字符串类添加专门化,例如。
模板
结构是_字符串:std::true_类型{};

这应该可以在C++17中使用

#include <iostream>
#include <string>
#include <type_traits>
 
template<typename T>
struct is_string
        : public std::disjunction<
                std::is_same<char *, typename std::decay_t<T>>,
                std::is_same<const char *, typename std::decay_t<T>>,
                std::is_same<std::string, typename std::decay_t<T>>
        > {
};

int main()
{
    std::cout << std::boolalpha;
    std::string str = "i am a string";
    std::cout << is_string<decltype(str)>::value << std::endl; // "true"
    std::cout << is_string<decltype("i am a string literal")>::value << std::endl; // "true"
}
#包括
#包括
#包括
模板
结构是字符串
:公共标准::析取<
std::是一样的,
std::是一样的,
std::是一样的吗
> {
};
int main()
{

std::cout关于
static\u cast(“一”)呢
?还是一个接受数组并将其强制转换为指针的通用模板?@KerrekSB:在函数调用中封装每个字符串文字似乎是一个真正的负担,但trait可以使用函数模板来测试类型是否可以转换为char指针……仅供参考,assert()中缺少一个结束字符@semisight:谢谢,更正。我刚刚意识到,如果
is_string::value
为true,那么您对
const char*
的转换将不起作用,是吗?(他们在C++11中添加了显式转换吗?)
未包含在11中,不。我认为,等效值应为
std::integral\u常量
包含在C++17库中。请参阅并注意这是短路特性。
#include <iostream>
#include <string>
#include <type_traits>
 
template<typename T>
struct is_string
        : public std::disjunction<
                std::is_same<char *, typename std::decay_t<T>>,
                std::is_same<const char *, typename std::decay_t<T>>,
                std::is_same<std::string, typename std::decay_t<T>>
        > {
};

int main()
{
    std::cout << std::boolalpha;
    std::string str = "i am a string";
    std::cout << is_string<decltype(str)>::value << std::endl; // "true"
    std::cout << is_string<decltype("i am a string literal")>::value << std::endl; // "true"
}