Могу ли я использовать (усилить) привязку с шаблоном функции?

Можно ли связать аргументы с шаблоном функции с помощью (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

Идеи?


person Martin Ba    schedule 12.08.2011    source источник
comment
Если целью является полиморфное поведение, то это может представлять интерес.   -  person Luc Danton    schedule 12.08.2011


Ответы (2)


Я так не думаю, только потому, что boost::bind в данном случае ищет указатель на функцию, а не шаблон функции. Когда вы передаете FCall2Templ<int, int>, компилятор создает экземпляр функции, и она передается как указатель на функцию.

Однако вы можете сделать следующее, используя функтор

struct FCall3Templ {

  template<typename ARG1, typename ARG2>
  ARG1 operator()(ARG1 arg1, ARG2 arg2) {
    return arg1+arg2;
  }
};
int main() {
  boost::bind<int>(FCall3Templ(), 45, 56)();
  boost::bind<double>(FCall3Templ(), 45.0, 56.0)();
  return 0;
}

Вы должны указать тип возвращаемого значения, так как тип возвращаемого значения привязан к входным данным. Если результат не меняется, вы можете просто добавить typedef T result_type в шаблон, чтобы привязка могла определить, каков результат.

person Dave S    schedule 12.08.2011

Кажется, это работает, если вы создаете ссылку на функцию:

int (&fun)(int, int) = FCall2Templ;
int res2 = boost::bind(fun, 42, 56)();

Or:

typedef int (&IntFun)(int, int);
int res3 = boost::bind(IntFun(FCall2Templ), 42, 56)();

(Проверено на GCC)

person Alastair    schedule 12.08.2011