首页 > 解决方案 > f(U(*)()) 只是 f(U*) 的一个特殊版本吗?

问题描述

在阅读 wiki 页面时,我发现了这个示例代码

template <class T>
struct is_pointer
{
  template <class U>
  static char is_ptr(U *); #1

  template <class X, class Y>
  static char is_ptr(Y X::*);

  template <class U>
  static char is_ptr(U (*)()); #2

  static double is_ptr(...);

  static T t;
  enum { value = sizeof(is_ptr(t)) == sizeof(char) };
};

对我来说,#2 只是#1 的特殊版本,所以看起来是多余的。

我做错了什么吗?在 C++ 编译器眼中会是什么样子?

标签: c++templatestemplate-specialization

解决方案


template <class U> static char is_ptr(U *);:is_ptr是一个函数,它接受一个指向U(没有名称)的指针并返回一个char.

template <class U> static char is_ptr(U (*)());:is_ptr是一个采用函数指针(没有名称)的函数,它不获取参数并返回 a U,并返回 a char

因此,一个得到一个指向 a 的指针,另一个得到一个U返回 a 的函数指针U


推荐阅读