模板重载(差异参数个数)

时间:2011-07-31 06:15:51

标签: c++ templates boost-bind

我想创建下面看到的这些功能模板。他们的目的是比较仿函数,但我需要为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类型的那个,一切都会正常工作。

如何让它选择正确使用的功能模板?

1 个答案:

答案 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) );
}