2016-12-28 3 views
-3

Пусть у меня есть этот класс:Передача функции к классу

template<class K, class func1, class func2> 
class findMax { 
    K* key; 
    func1 cmp; 
    func2 areSame; 
}; 

template<class K, class func1, class func2> 
findMax<K, func1, func2>::findMax(K n, func1 isValid, func2 areSameFunc) { 

    cmp = isValid; 
    areSame = areSameFunc; 
} 

Как сделать экземпляр этого класса?
Я пробовал: сообщение

typedef bool (*someFunc)(int); 
typedef bool (*someFunc2)(int, int); 

findMax<int, someFunc, someFunc2> u(7, isValid, areSame); // Doesn't compile, error below. 

Ошибка:

Invalid arguments ' 
Candidates are: 
findMax(const findMax<int,bool (*)(int, int),bool (*)(int)> &) 
findMax() 
findMax(int, #10000, ?, ?) 
' 

где:

bool isValid (int k) { 
    return (k>0); 
} 

bool areSame (int key, int key2) { 
    return key==key2; 
} 

Но это не работает. Я также пробовал другие подходы, но не мог найти, как это сделать.
Как мне это сделать?

+1

Что не работает? – Carcigenicate

+0

@Carcigenicate К сожалению, добавлено. – SomeoneWithAQuestion

+0

@SomeoneWithAQuestion Используйте 'std :: function' с кодом C++. –

ответ

1

Вам нужно разобраться в объявлении/определении конструктора и, возможно, также в объявлении члена (вероятно, это должно быть значение, а не указатель). При этом он должен быть прямым для создания объектов.

Лично я бы на самом деле не указал оба аргумента шаблона, а создал подходящую фабричную функцию. Например:

template<typename K, typename Fun1, typename Fun2> 
class findMax { 
    K  key; 
    Fun1 cmp; 
    Fun2 areSame; 
public: 
    findMax(K n, Fun1 isValid, Fun2 areSameFunc) 
     : key(n) 
     , cmp(isValid) 
     , areSame(areSameFunc) { 
    } 
}; 

template<typename K, typename Fun1, typename Fun2> 
findMax<K, Fun1, Fun2> makeFindMax(K n, Fun1 fun1, Fun2 fun2) { 
    return findMax<K, Fun1, Fun2>(n, fun1, fun2); 
} 

bool isValid (int k) { 
    return (k>0); 
} 

bool areSame (int key, int key2) { 
    return key==key2; 
} 

int main() { 
    auto obj = makeFindMax(7, isValid, areSame); 
} 
+0

Спасибо за ответ. findMax фактически находится в файле заголовка, а остальная часть кода, который я опубликовал, находится в исходном файле. Есть ли способ сделать это без необходимости вызова другой функции из моего исходного файла для создания нового 'findMax'? – SomeoneWithAQuestion

+0

@SomeoneWithAQuestion: нет ничего плохого в объявлении фабричной функции в заголовке. Однако, как только вы правильно определили свой конструктор, вы можете просто вызвать его, как это сделано в 'makeFindMax()'. –

Смежные вопросы