Вы можете использовать привязку Boost или привязку TR1 (на последних компиляторах);;
<удар>
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<void(double*)> stored = std::bind(&myClass::classUDF, boost::ref(myClassObj))
(при условии, что сейчас компилятор поддерживает C++0x. Я уверен, что Boost имеет boost::function‹> где-то)
Ванильные указатели C++ на функцию-член
Без такой магии вам понадобился бы синтаксис указатель на функцию-член:
Смотрите также прямую трансляцию на http://ideone.com/Ld7It.
Изменить, чтобы прояснить для комментаторов, очевидно, что это работает только если вы контролируете определение externalFunction. Это прямой ответ на фрагмент /broken/ в ОП.
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);
}
Идиоматическое решение С++ 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;
}
person
sehe
schedule
10.11.2011
externalFunction
выглядит фиктивной. - person Kerrek SB   schedule 10.11.2011externalFunction(int n, void (*udf)(double*) );
. - person jpalecek   schedule 10.11.2011int arr[]
превращается вint* arr
). На самом деле я предпочитаю метод OP, более распространенный из них содержит ненужный шум. - person GManNickG   schedule 10.11.2011