Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Function Objects - таки как пользоваться? 08.05.03 16:48 Число просмотров: 1400
Автор: amirul <Serge> Статус: The Elderman
|
> Сразу получаю облом. > > error C2664: 'TraverseVector' : cannot convert parameter 1 > from 'class AddNumber' to 'void (__cdecl *)(int &)' > No user-defined-conversion operator available that > can perform this conversion, or the operator cannot be > called Ну да объект-функция все-таки остается объектом. И такое преобразование невозможно (вернее ты его не опредилил). Есть несколько вариантов:
1) Самому перегрузить TraverseVector, чтоб он принимал еще и объекты класса AddNumber
2) Добавить в AddNumber преобразование operator TraveseFuncPtr(), но тогда ты потеряешь параметр
3) ИМХО самый правильный вариант. Поступить как сделано в STL. "Тот же for_each" принимает класс, потому как он может принять ЛЮБОЙ объект, к которому применим operator(). К объекту типа void (*) (int&) он применим (как и к любому указателю на функцию), а в классе AddNumber он перегружен и тоже применим. Поэтому шаблон инстанцируется дважды (короче два разных кода одной функции получается): один раз для указателя и один раз для AddNumber-а. Если кода не сильно много, то можно не заморачиваться с эффективностью и частичной спецификацией шаблонов и сделать следующее:
class A {
public:
std::vector < int > m_vData;
template <class T>
void TraverseVector(T in_func) {
for (int i = 0; i < m_vData.size(); i++)
in_func(m_vData[i]);
}
};
> Пытался пробиться через дебри STL, но там тот же for_each > принимает > КЛАСС (!) - параметр шаблона которым > собственно и является. (Хотя при использовании for_each я > явно ему параметр не передаю т.е. испльзую как обычную > фунцкию). Можно прочитать у того же Страуструпа :-) про выведение типа шаблона. Короче, явно указывать тип параметра шаблона не надо если компилятор сам может его вывести. В частности он может сделать это по агрументам шаблонной функции.
> > Вот так. Кто что скажет?
|
|
|