指向 const 类型的 const 指针的模板特化

发布于 2024-11-25 05:37:12 字数 739 浏览 1 评论 0原文

我正在阅读 http:// /bartoszmilewski.wordpress.com/2009/10/21/what-does-haskell-have-to-do-with-c/ 并遇到此代码来检查是否类型是否是指针:

template<class T> struct
isPtr {
 static const bool value = false;
};

template<class U> struct
isPtr<U*> {
 static const bool value = true;
};

template<class U> struct
isPtr<U * const> {
 static const bool value = true;
};

如何专门化通用模板来处理指向 const 类型的 const 指针的情况? 如果我这样做:

std::cout << isPtr <int const * const>::value << '\n';

当我期待错误时,我会得到正确的结果。 有人可以解释一下吗?

编辑:使用 VC++ 2010 编译器(表达:-)

I was reading http://bartoszmilewski.wordpress.com/2009/10/21/what-does-haskell-have-to-do-with-c/ and came across this code to check if a type is a pointer or not:

template<class T> struct
isPtr {
 static const bool value = false;
};

template<class U> struct
isPtr<U*> {
 static const bool value = true;
};

template<class U> struct
isPtr<U * const> {
 static const bool value = true;
};

How do i specialize the general template to handle case for const pointer to a const type?
If i do this:

std::cout << isPtr <int const * const>::value << '\n';

i get a true when i am expecting false.
Can someone explain?

EDIT: using VC++ 2010 compiler (express :-)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

胡渣熟男 2024-12-02 05:37:12

结果只是正确;当您调用 isPtr时,将调用您的第三个专业化;您将其设置为true

在这种情况下,您可以选择 enum 而不是 bool,因为您有 3 种状态:

enum TYPE
{
  NOT_POINTER,
  IS_POINTER,
  IS_CONST_POINTER
};

template<class T> struct
isPtr {
 static const TYPE value = NOT_POINTER;
};

template<class U> struct
isPtr<U*> {
 static const TYPE value = IS_POINTER;
};

template<class U> struct
isPtr<U * const> {
 static const TYPE value = IS_CONST_POINTER;
};

这里是 演示

The result is coming correct only; your third specialization is invoked when you call isPtr <int const * const>; which you are setting to true.

You can choose enum over bool in this case as you have 3 states:

enum TYPE
{
  NOT_POINTER,
  IS_POINTER,
  IS_CONST_POINTER
};

template<class T> struct
isPtr {
 static const TYPE value = NOT_POINTER;
};

template<class U> struct
isPtr<U*> {
 static const TYPE value = IS_POINTER;
};

template<class U> struct
isPtr<U * const> {
 static const TYPE value = IS_CONST_POINTER;
};

Here is the demo.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文