我正在尝试编写一个名为is_c_str
的模板,以测试类型是否为c风格字符串。 我需要这个模板来尝试编写一个STL容器迭代器的模板特化中提到的to_string函数。
我需要区分c_str和其他类型的指针和迭代器,以便我可以按字面值表示第一个,并将指针/迭代器呈现为不透明的"itor"或"ptr"。 代码如下:
#include <iostream>
template<class T>
struct is_c_str
: std::integral_constant<
bool,
!std::is_same<char *, typename std::remove_reference<typename std::remove_cv<T>::type>::type>::value
> {};
int main() {
auto sz = "Hello"; //Or: const char * sz = "Hello";
int i;
double d;
std::cout << is_c_str<decltype(sz)>::value << ", "
<< is_c_str<decltype(i)>::value << ", "
<< is_c_str<decltype(d)>::value << std::endl;
}
然而,is_c_str
不仅可以捕获 const char *
,还可以捕获 int
和 double
。上述代码的输出结果为:
1, 1, 1
(截至gcc-4.8.1版本)。我的问题是如何修复
is_c_str
以正确捕获C风格字符串?
remove_reference<remove_cv<int>>
不就是char *
吗?是的,没错。 - chrischar*
只是一个指向char
的指针。只有当它指向以 null 结尾的数组时,它才是 C 风格的字符串。 - user3553031wchar_t
、char16_t
和char32_t
也可以用于C风格字符串,并且实际上已经在使用中。 - dyptemplate<class T> to_string(T * str);
的重载函数,并使用 SFINAE 进行限制,除非std::decay_t<T>
是其中之一:char
、wchar_t
、char16_t
或char32_t
。 - T.C.