c++ - 我如何使用 S(*)(int)?

标签 c++

出于教育原因,我正在使用 clang-12 std=c++17 学习 C++ 语言

我有以下代码:

完整代码

#include <cstdio>
#include <iostream>
#include <type_traits>

using namespace std;

struct S {
  void operator()(int) {}
};

int main()
{
  S(*d)(int); 

  //d = whatValue??

  return 0;
}

我在研究C++语言中存在的变量类型,遇到了上面这种情况。

我可以为 <b>d</b> 分配什么值?变量?

会不会是语言错误?我已经研究了几个关于 stackoverflow 和 cppreference 的主题,但还没有找到任何方法来初始化这个变量 S(*d)(int) .

最佳答案

变量d是一个指向接受 int 的函数的指针作为参数并返回 S .请注意,它不能指向非 static成员函数。例如,您可以像这样使用它:

struct S {
    void operator()(int) {}
};

S f(int) { return S(); }

int main()
{
    S(*d)(int) = &f;
    S rc = d(17);
}

随着函数退化为指针类型,您实际上可以保留 &出去。对于非 static 情况并非如此不过,成员函数。如果你想获得一个指向 S 的成员函数的指针服用int作为参数并返回 void (你的 operator() 返回 void 而不是 S )你需要使用 & :

int main() {
    void (S::*d)(int) = &S::operator();
    S obj;
    S rc = (obj.*d)(17); // use d
}

指向成员函数的指针与指向函数的指针不同,因为它们有一个隐含的第一个参数:this指针。在 C++ 中,很少有函数指针被用于接口(interface) C 代码之外的其他原因:使用 std::function<void(int)>更灵活,尽管也是类型删除并且很可能涉及 virtual函数调用并且不可内联。如果函数可以是函数模板,则通常传递 std::invoke() 的函数对象。 ed(而不是直接调用)支持函数指针、指向成员函数的指针、指向非函数成员的指针、lambda、函数等。

关于c++ - 我如何使用 S(*)(int)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70551870/

相关文章:

c++ - C++ Linux 中的套接字超时

c++ - 如何调用QCombobox的linedit的KeyPressEvent(QKeyEvent *)?

c++ - 检查 Windows 版本

c++ - 如何告诉 scons 使用 C++11 标准

c++ - 存在 C++ 设置错误的用户对象

c++ - Qt 5.3 连接 lambda

c++ - 如果我们从某个地址开始,我们如何确定变量在整个程序中占用的地址?

c++ - 基于范围的过对列表

c++ - 如何隐藏显示 HTML5 标记的 Web 浏览器控件 (IE) 的滚动条和窗口边框?

c++ - initializer_list 作为数组引用参数的参数?