我可以将(增强)绑定与函数模板一起使用吗?
是否可以使用 (boost )绑定?
// Define a template function (just a silly example)
template<typename ARG1, typename ARG2>
ARG1 FCall2Templ(ARG1 arg1, ARG2 arg2)
{
return arg1 + arg2;
}
// try to bind this template function (and call it)
...
boost::bind(FCall2Templ<int, int>, 42, 56)(); // This works
boost::bind(FCall2Templ, 42, 56)(); // This emits 5 pages of error messages on VS2005
// beginning with: error C2780:
// 'boost::_bi::bind_t<_bi::dm_result<MT::* ,A1>::type,boost::_mfi::dm<M,T>,_bi::list_av_1<A1>::type>
// boost::bind(M T::* ,A1)' : expects 2 arguments - 3 provided
boost::bind<int>(FCall2Templ, 42, 56)(); // error C2665: 'boost::bind' : none of the 2 overloads could convert all the argument types
有想法吗?
Is it possible to bind arguments to a function template with (boost) bind?
// Define a template function (just a silly example)
template<typename ARG1, typename ARG2>
ARG1 FCall2Templ(ARG1 arg1, ARG2 arg2)
{
return arg1 + arg2;
}
// try to bind this template function (and call it)
...
boost::bind(FCall2Templ<int, int>, 42, 56)(); // This works
boost::bind(FCall2Templ, 42, 56)(); // This emits 5 pages of error messages on VS2005
// beginning with: error C2780:
// 'boost::_bi::bind_t<_bi::dm_result<MT::* ,A1>::type,boost::_mfi::dm<M,T>,_bi::list_av_1<A1>::type>
// boost::bind(M T::* ,A1)' : expects 2 arguments - 3 provided
boost::bind<int>(FCall2Templ, 42, 56)(); // error C2665: 'boost::bind' : none of the 2 overloads could convert all the argument types
Ideas?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我不这么认为,只是因为在这种情况下 boost::bind 正在寻找函数指针,而不是函数模板。当您传入
FCall2Templ
时,编译器会实例化该函数并将其作为函数指针传递。但是,您可以使用函子执行以下操作。
您必须指定返回类型,因为返回类型与输入相关联。如果返回没有变化,那么您只需将
typedef T result_type
添加到模板中,以便 Bind 可以确定结果是什么I don't think so, only because
boost::bind
in this case is looking for a function pointer, not a function template. When you pass inFCall2Templ<int, int>
, the compiler instantiates the function and it is passed as a function pointer.However, you can do the following using a functor
You have to specify the return type, since the return type is tied to the inputs. If the return doesn't vary, then you can just add
typedef T result_type
to the template, so that bind can determine what the result is如果您创建函数引用,它似乎可以工作:
或者:(
在 GCC 上测试)
It seems to work if you create a function reference:
Or:
(Tested on GCC)