我想创建下面看到的这些功能模板。他们的目的是比较仿函数,但我需要为boost.bind类型的仿函数介绍一个特殊情况。
template<typename R, typename F, typename L>
void compare(boost::_bi::bind_t<R, F, L>& lhs, boost::_bi::bind_t<R, F, L>& rhs)
{
std::cout << lhs.compare(rhs) << std::endl;
}
template<typename T>
void compare(T lhs, T rhs)
{
std::cout << (lhs == rhs) << std::endl;
}
问题在于,当我执行compare(boost::bind(func, 1), boost::bind(func, 1))
时,编译器会尝试使用第二个模板。如果我注释掉第二个,它将正确使用专门用于boost.bind类型的那个,一切都会正常工作。
如何让它选择正确使用的功能模板?
答案 0 :(得分:1)
boost::bind
返回一个不能绑定到非const
引用的值。您更好的专业模板需要按值或const
引用获取参数,否则将不会在调用中考虑:compare( boost::bind(func, 1), boost::bind(func, 1) )
。
此测试程序在我的平台上编译并正常运行。
#include <boost/bind/bind.hpp>
#include <iostream>
#include <ostream>
template<typename R, typename F, typename L>
void compare(const boost::_bi::bind_t<R, F, L>& lhs
, const boost::_bi::bind_t<R, F, L>& rhs)
{
std::cout << lhs.compare(rhs) << std::endl;
}
template<typename T>
void compare(T lhs, T rhs)
{
std::cout << (lhs == rhs) << std::endl;
}
void func(int) {}
int main()
{
compare( boost::bind(func, 1), boost::bind(func, 1) );
}