У меня есть шаблон, который требует, чтобы я передавал ему функтор в качестве параметра типа для выполнения некоторых вычислений. Я хотел бы специализировать этот функтор на основе другой функции, которую я хочу использовать для фактического выполнения вычислений. В принципе, я хочу, чтобы это сделать (что не является законным, я переосмысление функтора):Специализируется на шаблоне функций с различными сигнатурами?
template<typename T, int (*func)(int)>
struct Functor
{
T val;
int operator()(int x) { return func(2); }
};
template<typename T, int (*func)(int, int)>
struct Functor
{
T val;
int operator()(int y) { return func(y, 2); }
};
Component<Functor<calculationFunction1>> comp1;
Component<Functor<calculationFunction2>> comp2;
auto result1 = comp1.Compute();
auto result2 = comp2.Compute();
Я попытался с помощью частичной специализации, чтобы получить эту работу, а также, но это не кажется, быть законным. Я не уверен, что можно получить то, что я хочу, поскольку две функции имеют разные подписи. Каков наилучший способ добиться того, что я пытаюсь сделать здесь?
Рассматривали ли вы что-то вроде 'повышающего :: bind'? –
@JoeZ Я заглянул в него, но я оказался в основном в том же месте. Тип полученного объекта от использования boost :: bind на 'calculateFunction1' отличается от типа результирующего объекта от' calculateFunction2'. Адаптер «Functor» по-прежнему должен иметь возможность обрабатывать два разных непиговых параметра. Разве я что-то пропустил? –
Я думаю, что это действительно зависит от того, что вы делаете _actually_ с дополнительными аргументами в функции multi-arg. Возможно, более простой вопрос: зачем вам нужно специализировать «Functor» напрямую? Почему у вас нет «Functor1» и «Functor2» для обработки функций с одним аргументом и двойным аргументом? –