2013-11-09 4 views
0

У меня есть шаблон, который требует, чтобы я передавал ему функтор в качестве параметра типа для выполнения некоторых вычислений. Я хотел бы специализировать этот функтор на основе другой функции, которую я хочу использовать для фактического выполнения вычислений. В принципе, я хочу, чтобы это сделать (что не является законным, я переосмысление функтора):Специализируется на шаблоне функций с различными сигнатурами?

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(); 

Я попытался с помощью частичной специализации, чтобы получить эту работу, а также, но это не кажется, быть законным. Я не уверен, что можно получить то, что я хочу, поскольку две функции имеют разные подписи. Каков наилучший способ добиться того, что я пытаюсь сделать здесь?

+0

Рассматривали ли вы что-то вроде 'повышающего :: bind'? –

+0

@JoeZ Я заглянул в него, но я оказался в основном в том же месте. Тип полученного объекта от использования boost :: bind на 'calculateFunction1' отличается от типа результирующего объекта от' calculateFunction2'. Адаптер «Functor» по-прежнему должен иметь возможность обрабатывать два разных непиговых параметра. Разве я что-то пропустил? –

+0

Я думаю, что это действительно зависит от того, что вы делаете _actually_ с дополнительными аргументами в функции multi-arg. Возможно, более простой вопрос: зачем вам нужно специализировать «Functor» напрямую? Почему у вас нет «Functor1» и «Functor2» для обработки функций с одним аргументом и двойным аргументом? –

ответ

-1

Как насчет:

template<typename T, typename SOME_FUNC_TYPE, SOME_FUNC_TYPE func > 
struct Functor {}; 

typedef int (*SingleArgFunc)(int); 
typedef int (*DoubleArgFunc)(int,int); 

template<typename T, SingleArgFunc func> 
struct Functor<T, SingleArgFunc, func> 
{ 
    T val; 
    int operator()(int x) { return func(2); } 
}; 

template<typename T, DoubleArgFunc func> 
struct Functor<T, DoubleArgFunc, func> 
{ 
    T val; 
    int operator()(int y) { return func(y, 2); } 
}; 

int calculationFunction1 (int) { return 0; } 
int calculationFunction2 (int, int) { return 0; } 

template <typename FUNCTOR> 
struct Component 
{ 
    int Compute (void) { return FUNCTOR()(0); } 
}; 

Component<Functor<int, decltype(&calculationFunction1), calculationFunction1>> comp1; 
Component<Functor<int, decltype(&calculationFunction2), calculationFunction2>> comp2; 

auto result1 = comp1.Compute(); 
auto result2 = comp2.Compute(); 
Смежные вопросы