在极少数情况下,我会想要明确声明变量?
那么f4的类型是什么?
以下代码来自cppreference
#include <random>
#include <iostream>
#include <memory>
#include <functional>
struct Foo {
int data = 10;
};
int main()
{
using namespace std::placeholders; // for _1, _2, _3...
Foo foo;
auto f4 = std::bind(&Foo::data, _1); // bind to member data
std::cout << f4(foo) << '\n';
}
class C
{
string m1;
string m2;
};
typedef decltype(std::bind(&C::m1, placeholders::_1)) Field;
Field foo[] =
{
std::bind(&C::m1, placeholders::_1);
std::bind(&C::m2, placeholders::_1);
}
答案 0 :(得分:4)
如果您需要声明与f4
类型匹配的内容,可以使用decltype(f4)
指定类型:
decltype(f4) f5;
答案 1 :(得分:3)
f4
的类型将是一些未指定的类型,从std::bind返回。
您可以使用例如TD
来查看编译器错误。
template<typename>
struct TD;
// in main
TD<decltype(f4)> _;
注意:decltype
会返回f4
的实际类型。
注意:std::bind
的结果可以通过适当的签名分配给std::function
。对于您的第一个示例,它将是std::function<int(Foo&)>
答案 2 :(得分:2)
万一你想再次内省类型,那里有一个不错的库:Boost.TypeIndex会给你一个漂亮的类型。
对于Clang 3.4
type_id_with_cvr<decltype(f4)>().pretty_name()
std::_Bind<std::_Mem_fn<int Foo::*> (std::_Placeholder<1>)>
答案 3 :(得分:1)
通过致电std::bind
返回的类型为unspecified by the standard.
每个实现都可以自由发明任何类型的作品。