c++ - int() 和 int(*)() 有什么区别?

标签 c++ templates

我正在尝试创建一个识别函数的类模板,我可以在其中识别函数何时专门化 R (*) () 的类模型, 但在 std::function你可以申报 return_type () , 和 std::is_same< int(), int (*) () >.::value为零。

这是什么 int () statement mean 和int () 有什么区别和 <br/>int (*) () ?

更新:所以 int ()是函数声明或函数类型并且int (*)()是指向函数的指针。但是 waht 是 int (std::string::<em>)()</em> 的类型函数?类似于 int std::string:: () ,或喜欢 std::function int(const std::string&) ?如何让这个程序输出 1? <p></p> <pre><code>#include <iostream> template<typename A,typename B> struct IsSame{ enum{ value = 0}; }; template<typename A> struct IsSame<A,A>{ enum{ value = 1 }; }; typedef int (SumType)(int,int)const; class X{ public: SumType sum; }; int X::sum(int a,int b)const{ return a+b; } int main() { std::cout << IsSame< int (const std::string&,int,int)const, decltype( &X::sum)>::value; } </code></pre>

最佳答案

一个函数有一个像 void() 这样的类型,如果你获取它的地址,你会得到一个指向该函数的指针 void(*)()。它们不是同一类型,尽管函数可以衰减为指向函数的指针,其方式类似于数组衰减为指向第一个成员的指针。

这意味着您可以声明一个函数:

void f();

并将其分配给指向函数(具有相同签名)的指针:

void (*p_to_f)() = f;

并且该函数衰减为指向函数的指针。
这就是为什么我认为很难理解 void()void(*)() 之间的区别,但它们是不同的类型,并且这种区别可以是在模板中很重要(这种衰减不一定会发生)。

不发生衰减的一个重要示例是匹配模板特化时。例如考虑 std::function 的作用:

template <class>
class function;

template <class R, class ... Args>
class function<R(Args...)> { /* ... stuff ... */ };

函数类型的特化不同于函数指针类型的特化。

function<void(int,int)> f;//matches specialisation
function<void(*)(int,int)> g;//does not match specialisation

回应 OP 的评论(现已删除):
为了也匹配指向函数的指针,您可以执行以下操作:

template <class R, class ... Args>
function<R(*)(Args...)> : function<R(Args...>{};

这实质上意味着您将函数和指向函数的指针视为相同。如果要匹配尽可能多的函数,还必须考虑成员函数、const 成员函数和 noexcept 函数(自 C++17 起)。如果想彻底,还有&&&const &const&& volatile 等...但我不会担心这些,除非它们真的出现了。

关于c++ - int() 和 int(*)() 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48225401/

相关文章:

c++ - 对映射中的lower_bound和upper_bound

c++ - 使用带有引用的手动内存管理?

c++ - 如何将模板中具有非依赖名称的 msvc++ 代码移植到 Linux?

c++ - 如何轻松实现成员函数作为模板参数?

c++ - 定义常量数组以用作模板参数

c++ - 在 C++11 中使用模板元编程连接列表

c++ - Nginx 有符号整数,CVE-2013-2028

c++ - C++ 实时 3D 可视化

javascript - 如何通过 C++/Javascript 项目跟踪函数和变量的使用

c++ - 将 const 添加到函数模板指针参数