std :: tr1 :: mem_fn返回类型

时间:2010-08-02 17:52:16

标签: c++ std tr1

我想把结果放在:

std::tr1::mem_fn(&ClassA::method);

在变量内部,这个变量的类型是什么?

看起来像这样:

MagicalType fun = std::tr1::mem_fn(&ClassA::method);

此外,std::tr1::bind的结果类型是什么?

谢谢!

3 个答案:

答案 0 :(得分:5)

std::tr1::mem_fnstd::tr1::bind的返回类型未指定。

您可以将std::tr1::bind的结果存储在std::tr1::function

struct ClassA { 
    void Func() { }
};

ClassA obj;
std::tr1::function<void()> bound_memfun(std::tr1::bind(&ClassA::Func, obj));

您还可以将std::tr1::mem_fn的结果存储在std::tr1::function

std::tr1::function<void(ClassA&)> memfun_wrap(std::tr1::mem_fn(&ClassA::Func));

答案 1 :(得分:2)

mem_fnbind的返回类型是未指定。这意味着,根据参数返回不同类型的对象,标准没有规定必须如何实现此功能的详细信息。

如果你想知道具有特定库实现的特定情况下的类型(为了理论上的兴趣,我希望),你总是会导致错误,并从错误消息中获取类型。 E.g:

#include <functional>

struct X
{
    double method(float);
};

int x = std::mem_fn(&X::method);

9 Untitled.cpp cannot convert 'std::_Mem_fn<double (X::*)(float)>' to 'int' in initialization

在这种情况下,请注意类型的名称保留供内部使用。在您的代码中,您不应该使用带有前导下划线(和大写字母)的任何内容。

在C ++ 0x中,我认为返回类型为auto:)

auto fun = std::mem_fn(&ClassA::method);

答案 2 :(得分:0)

该函数可以通过以下方式实现(因此您也可以看到返回类型):您可以在http://webcompiler.cloudapp.net/尝试这段代码。不幸的是,它使用了可变参数模板https://en.wikipedia.org/wiki/Variadic_template,它们只是C ++ 11标准的一部分。

UIImageView