Вы можете использовать Boost bind или TR1 bind (на последних компиляторах) ;;
externalFunction(n, boost::bind(&myClass::classUDF, boost::ref(myClassObj)));
К сожалению, я жил внесбыточная мечта за последние 10 минут.Единственный способ продвинуться вперед - это вызвать цель, используя некую статическую функцию-обертку.Другие ответы имеют различные аккуратные (специфичные для компилятора) лакомые кусочки, но вот главный трюк:
void externalFunction(int n, void (*udf)(double*) )
{ double x; udf(&x); }
myClass myClassObj;
void wrapper(double* d) { myClassObj.classUDF(d); }
int main()
{
externalFunction(1, &wrapper);
}
std :: function <>
Сохранение связанной функции в переменной, напримерэто:
std::function<void(double*)> stored = std::bind(&myClass::classUDF, boost::ref(myClassObj))
(при условии поддержки C ++ 0x в компиляторе. Я уверен, что Boost имеет boost :: function <> где-то)
Указатели Vanilla C ++ на член-функция
Без такой магии вам понадобится указатель на член функции синтаксис:
Смотрите также в прямом эфире на http://ideone.com/Ld7It
Изменить , чтобы уточнить для комментаторов, очевидно, это работает только если у вас есть контроль над определением externalFunction.Это является прямым ответом на / broken / snippet int OP.
struct myClass
{
void classUDF(double* a) { };
};
void externalFunction(int n, void (myClass::*udf)(double*) )
{
myClass myClassObj;
double x;
(myClassObj.*udf)(&x);
}
int main()
{
externalFunction(1, &myClass::classUDF);
}
C ++ 98 идиоматическое решение
// mem_fun_ref example
#include <iostream>
#include <functional>
#include <vector>
#include <algorithm>
#include <string>
int main ()
{
std::vector<std::string> numbers;
// populate vector:
numbers.push_back("one");
numbers.push_back("two");
numbers.push_back("three");
numbers.push_back("four");
numbers.push_back("five");
std::vector <int> lengths (numbers.size());
std::transform (numbers.begin(), numbers.end(), lengths.begin(),
std::mem_fun_ref(&std::string::length));
for (int i=0; i<5; i++) {
std::cout << numbers[i] << " has " << lengths[i] << " letters.\n";
}
return 0;
}