那个由汽车推断出来的类型是什么?

时间:2015-01-26 08:34:10

标签: c++ auto

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

那么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';
}

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);
}

4 个答案:

答案 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()

is

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

答案 3 :(得分:1)

通过致电std::bind返回的类型为unspecified by the standard.

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