我想把结果放在:
std::tr1::mem_fn(&ClassA::method);
在变量内部,这个变量的类型是什么?
看起来像这样:
MagicalType fun = std::tr1::mem_fn(&ClassA::method);
此外,std::tr1::bind
的结果类型是什么?
谢谢!
答案 0 :(得分:5)
std::tr1::mem_fn
和std::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_fn
和bind
的返回类型是未指定。这意味着,根据参数返回不同类型的对象,标准没有规定必须如何实现此功能的详细信息。
如果你想知道具有特定库实现的特定情况下的类型(为了理论上的兴趣,我希望),你总是会导致错误,并从错误消息中获取类型。 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