gpt4 book ai didi

c++ - 如何判断 C++ 模板类型是否为 C 样式字符串

转载 作者:IT老高 更新时间:2023-10-28 21:45:25 25 4
gpt4 key购买 nike

我正在尝试编写模板 is_c_str 来测试类型是否为 c 样式字符串。我需要这个来尝试编写一个 to_string 函数,如我的另一个问题所示: Template specialization for iterators of STL containers? .

我需要区分 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 *,还捕获 intdouble。以上代码输出:

1, 1, 1

(从 gcc-4.8.1 开始)。

我的问题是如何修复 is_c_str 以正确捕获 c 样式字符串?

最佳答案

您想检查类型是否与 char * 相同,但是您正在否定 std::is_same 的结果,这显然不会产生正确的结果。所以让我们删除它。

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

但是,这将导致输出 0, 0, 0。现在的问题是 remove_cv删除顶级 cv 限定符,但 char const * 中的 const 不是顶级的。


如果你想同时匹配 char *char const * 最简单的解决方案是:

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 ||
std::is_same<char const *, typename std::remove_reference<typename std::remove_cv<T>::type>::type>::value
> {};

以上版本仍然不匹配char[]。如果您也想匹配它们,并减少组合 std::remove_referencestd::remove_cv 的冗长,请使用 std::decay而是。

template<class T>
struct is_c_str
: std::integral_constant<
bool,
std::is_same<char const *, typename std::decay<T>::type>::value ||
std::is_same<char *, typename std::decay<T>::type>::value
> {};

关于c++ - 如何判断 C++ 模板类型是否为 C 样式字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24855160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com