Подать функцию в шаблон. С++

163
09 января 2018, 14:51

Добрый день.

Возникла задача, написать 4 функции которые будут различаться лишь подаваемыми типами и одной строкой в теле. При этом хотелось бы сделать это как можно более лаконично и изящно.

Мне показалось, что будет здорово написать шаблон и в качестве параметра передавать функцию, которая будет определять нужную строку. Примерно это у меня в голове должно выглядеть так:

template<class inType, class outType>
void defOp(const <inType>& IN1,const <inType>& IN2,<outType>& res, <FUNCTION>)
{   
    res = FUNCTION(iF,sF)
};

Хотелось бы понять как нужно подать в шаблон эту FUNCTION. Причем вызывать функцию хотелось бы, например, так:

defOp(IN1,IN2,res,add);
defOp(IN1,IN2,res,mult);

И как следует описывать add и mult?

Answer 1
template<class inType, class outType, typename Function>
void defOp(const inType& IN1, const inType& IN2, outType& res, Function func)
{   
    res = func(iF,sF);
};
Answer 2

Если вы хотите получить иметь возможность передавать в свою функцию любые "вызываемые" (callable) объекты, то либо

template<typename inType, typename outType, typename F>
void defOp(const inType &in1, const inType &in2, outType& res, F f)
{   
  res = f(in1, in2);
}

либо

template<typename inType, typename outType>
void defOp(const inType &in1, const inType &in2, outType& res,
           std::function<outType (inType, inType)> f)
{   
  res = f(in1, in2);
}

Во втором случае вы немножко жертвуете производительностью для того, чтобы избавиться от одного шаблонного параметра.

Если же общий тип передаваемой функции вам заранее известен и фиксирован, то его можно впрямую указать в качестве типа параметра. Например, если вы знаете, что передавать будете только обычные функции, то

template<typename inType, typename outType>
void defOp(const inType &in1, const inType &in2, outType& res,
           outType f(inType, inType))
{   
  res = f(in1, in2);
}

хотя никакой экономии над предыдущими вариантами такая конкретика не дает.

READ ALSO
проблема с getch() в игре

проблема с getch() в игре

Вот фрагмент кода игрыНужно чтобы пушка могла одновременно двигаться и стрелять но когда двигаю пушку например налево пушка останавливается...

144
Ошибка решения СЛАУ

Ошибка решения СЛАУ

Пытаюсь правильно составить слау, чтобы решить ГауссомПолучился примерно такой код:

164