汽车推断出的那种类型是什么?

what's that type deduced by auto?

本文关键字:类型 是什么 种类 推断出 汽车      更新时间:2023-10-16

在极少数情况下,我会想要显式声明变量?

那么F4的类型是什么?

下面的代码来自CPP首选项

#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';
}

ps1:我想声明一个绑定到 C::m1、C::m2 的 std::bind 数组......

class C
{
  string m1;
  string m2;
};

PS2:decltype解决了我的问题,谢谢大家。

typedef decltype(std::bind(&C::m1, placeholders::_1)) Field;
Field foo[] = 
{
  std::bind(&C::m1, placeholders::_1);
  std::bind(&C::m2, placeholders::_1);
}

如果需要声明与f4类型匹配的内容,可以使用decltype(f4)来指定类型:

decltype(f4) f5;

f4的类型将是某种未指定的类型,从 std::bind 返回。您可以在编译器错误中查看它,例如使用 TD .

template<typename>
struct TD;
// in main
TD<decltype(f4)> _;

注意:decltype返回f4的实际类型。

注意:std::bind的结果可以分配给具有正确签名的std::function。对于您的第一个示例,它将std::function<int(Foo&)>

以防

万一你想再次内省类型,有一个不错的库:Boost.TypeIndex,它会给你一个漂亮的类型。

对于叮当 3.4

type_id_with_cvr<decltype(f4)>().pretty_name()

std::_Bind<std::_Mem_fn<int Foo::*> (std::_Placeholder<1>)>

调用 std::bind 返回的类型未由标准指定

每个实现都可以自由发明任何类型的工作。