gpt4 book ai didi

C++ 绑定(bind)返回类型模板参数

转载 作者:行者123 更新时间:2023-11-30 01:46:22 24 4
gpt4 key购买 nike

我有以下代码:

#include <functional>

template <typename T>
class TD; // For displaying type

void f(int, int, int) { }

int main() {
auto g = std::bind(f, std::placeholders::_1, 2, 2);
TD<decltype(g)> td1;
return 0;
}

在此代码中 TD是一个模板技巧,用于显示通过 decltype 传递的模板参数.

编译器的输出如下(在 C++14 模式下编译):

prog.cpp: In function 'int main()':
prog.cpp:10:18: error: aggregate 'TD<std::_Bind<void (*(std::_Placeholder<1>, int, int))(int, int, int)> > td1' has incomplete type and cannot be defined
TD<decltype(g)> td1;
^

嗯,不完整的类型错误当然除外。但是让我对此错误消息感到好奇的是 std::_Bind<void (*(std::_Placeholder<1>, int, int))(int, int, int)> .我可以理解 std::_Bind是一个代理类,它定义了 operator()并使我们的目标成为可能。但是它的模板参数 void (*(std::_Placeholder<1>, int, int))(int, int, int)让我哇!我应该如何解释它?它在用户态代码中有什么用处吗?如何使用此声明创建自己的类?

最佳答案

void (*(std::_Placeholder<1>, int, int))(int, int, int)

这声明了一个带三个参数(std::_Placeholder<1>intint)的未命名函数,并返回一个指向带三个int 的函数的指针。 s 和返回 void .

让我们稍微简化一下。首先考虑一个简单的函数声明:

void f(int)

现在,在(函数或模板的)参数声明中,您可以省略名称并得到

void (int) 

如果用在函数声明的参数列表中,将等同于函数指针 void(*)(int) .

返回函数指针的函数声明如下:

void (*f(int))(int);
// ^ ^ <- this pair of parentheses changes
// the order in which the declaration is parsed.
// Without it, the return type would be `void*`
// and you'd get a syntax error

现在您可以删除名称 f您基本上得到了与您询问的相同的结果。

它的用途?显然它在实现 std::bind 时很有用:) 我现在想不出其他任何东西......

关于C++ 绑定(bind)返回类型模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33301383/

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