Передайте ссылку на функцию в структуру внутри этой функции.

Придумал хитрый код, и я застрял на нем.

У меня есть функция, производная от виртуального базового класса.

Внутри этой функции находится функтор. Функтору необходимо иметь доступ ко всем объектам внутри этой функции и ее родительского класса. Но при передаче ссылки на «это» или на имя функции я получаю сообщение об ошибке.

Причина всей этой сложности - ускорение кода. В алгоритме, который я кодирую, есть только одна дорогостоящая часть. Я намерен распараллелить эту часть. Однако этот шаг накапливает более двух значений одновременно за несколько шагов. Итак, мне нужно переопределить некоторые операторы. Функтор казался самым простым способом реализовать это.

Может ли кто-нибудь подсказать, как это решить.

представительный код ниже:

myClassA Glm{
public:
    virtual int functionA(int a, int b)=0;
}

class myClassB : public myClassA {
    public:
    virtual int functionA(int a, int b);
}

int functionA(int a, int b){


    // do some stuff

    struct MyFunctor : public binary_function<Fraction, DoubleIterator, Fraction> {

        MyFunctor(myClassA& in_class, int A) : myClassA(in_class), column(iColumn) {

        }                
        myClassA& myClassA;
        int A;

        Fraction operator()(double B, int A, ) {

            double C = doFancyStuff(A,B);
            return C;
        }

    }

    //use stl to accumulate
    accumulate(data.begin(), data.end(), temp, MyFunctor(*this,  column) );

}

person Noah    schedule 28.10.2011    source источник


Ответы (1)


Основная проблема здесь - преждевременная оптимизация.

Технически заменить текущий

int functionA(int a, int b){

с участием

int myClassB::functionA(int a, int b){

и, по крайней мере, ваши проблемы с this должны исчезнуть.

Тогда не то, что размещение ссылки в качестве члена данных, как ваш

myClassA& myClassA;

делает экземпляры не назначаемыми. И объект-функтор должен быть назначаемым. Так что, если вы решите продолжить, возможно, лучше заменить это на

myClassA* pMyClassA_;

и соответственно измените инициализацию.

Ура & hth.,

person Cheers and hth. - Alf    schedule 28.10.2011
comment
К сожалению, вчера вечером в 3 часа ночи я допустил опечатку в своем посте. В реальном коде действительно есть myClassB :: functionA (int a, int b) - person Noah; 28.10.2011