Перегрузка шаблона (разное количество аргументов) - PullRequest
2 голосов
/ 31 июля 2011

Я хотел создать эти шаблоны функций, которые вы видите ниже. Их цель - сравнить функторы, но мне нужно было рассмотреть специальный случай для функторов типа 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 Ответ

1 голос
/ 31 июля 2011

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) );
}
...