给出以下可调用对象:
struct callable : public std::unary_function <void, void>
{
void
operator()() const
{
std::cout << "hello world" << std::endl;
}
};
std::tr1::reference_wrapper<>
来电:
callable obj;
std::tr1::ref(obj)();
相反,当operator()
接受一个论点时:
struct callable : public std::unary_function <int, void>
{
void
operator()(int n) const
{
std::cout << n << std::endl;
}
};
std::tr1::bind
接受一个reference_wrapper作为可调用的包装器...
callable obj;
std::tr1::bind( std::tr1::ref(obj), 42 )();
但是这有什么问题?
std::tr1::ref(obj)(42);
g ++ - 4.4无法编译,并出现以下错误:
test.cpp:17: error: no match for call to ‘(std::tr1::reference_wrapper<const callable>) (int)’
/usr/include/c++/4.4/tr1_impl/functional:462: note: candidates are: typename std::tr1::result_of<typename std::tr1::_Function_to_function_pointer<_Tp, std::tr1::is_function::value>::type(_Args ...)>::type std::tr1::reference_wrapper<_Tp>::operator()(_Args& ...) const [with _Args = int, _Tp = const callable]
答案 0 :(得分:2)
是什么让你确定它有什么问题?我相信这应该有效:
#include <functional>
#include <iostream>
struct callable : public std::unary_function <int, void>
{
void
operator()(int n) const
{
std::cout << n << std::endl;
}
};
int main() {
callable obj;
std::tr1::ref(obj)(42);
return 0;
}
至少对于MS VC ++ 9,它编译并执行得很好,并且随便我看不出它也不应该与其他编译器一起工作。
编辑:做一些看TR1,我把它拿回来。它适用于VC ++ 9,但我不认为它真的需要工作。 VC ++ 9不支持变量模板参数,因此它们通过重载来支持它。深埋(<functional>
包括<xawrap>
,其中包括<xawrap0>
[反过来,包括<xawrap1>
])是生成参考和(重要)引用const变体的代码最多10个参数。几乎可以肯定,包含对const变体的引用可以使其工作。
答案 1 :(得分:2)
g ++ - 4.4的tr1 reference_wrapper的实现配备了以下运算符:
template<typename... _Args>
typename result_of<_M_func_type(_Args...)>::type
operator()(_Args&... __args) const
{
return __invoke(get(), __args...);
}
它通过引用获取参数。因此,无法通过r值参数调用reference_wrapper:
std::tr1::ref(obj)(42);
代替:
int arg = 42;
std::tr1::ref(obj)(arg);
工作正常。
std::tr1::bind( std::tr1::ref(obj), 42 )()
有效,因为bind通过副本获取参数。
答案 2 :(得分:0)
首先,对于null-ary函数使用std :: unary_function看起来很奇怪。 “一元”=一个参数。我不确定是否可以使用ArgType = void。
其次,你倒退了。第一个模板参数是关于参数类型,第二个是关于返回类型。因此,您的一元函数对象应该像这样定义:
struct callable : public std::unary_function<int,void>
{
void operator()(int n) const
{
std::cout << n << std::endl;
}
};