Вывод параметров шаблона C++ не работает

Мне нужно переопределить связь между boost::signals2::signal а также boost::function, Для этого я создал следующую функцию шаблона:

template<typename T>
void bind(boost::signals2::signal<T> &signal, boost::function<T> function) {
  // override code ...
}

Я хочу использовать это bind так просто, как это может быть. Из того, что я читал в постах по аналогичным вопросам, параметр шаблона должен быть выведен из аргументов функции. Но в моем случае, когда нет явного параметра, он не работает.

boost::signals2::signal<void ()> my_signal;

bind<void ()>(my_signal, boost::bind(&A::func, this)); // this works
bind(my_signal, boost::bind(&A::func, this));          // error: no matching function for call

Я что-то пропустил?
Может ли быть обходной путь, чтобы избежать явного параметра шаблона?

1 ответ

Решение

Второй тип аргумента не std::function<T>, но некоторый тип связывания, поэтому компилятор не может вывести T для второго параметра функции. Вы должны сказать компилятору "Вы в порядке, не найдя тип для T во втором параметре функции ". Это можно сделать, сделав второй параметр не выведенным контекстом.

template<typename T>
void bind(boost::signals2::signal<T> &signal, 
          typename std::common_type<boost::function<T>>::type function) {
  // override code ...
}
Другие вопросы по тегам