Передать ссылку на функцию в структуру внутри этой функции - PullRequest
0 голосов
/ 28 октября 2011

Сложный код, и я застрял на кусочке.

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

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

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

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

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

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) );

}

1 Ответ

1 голос
/ 28 октября 2011

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

Технически, замените текущий & hellip;

int functionA(int a, int b){

с & hellip;

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

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

Тогда не то, чтобы размещение ссылки в качестве элемента данных, например, вашего & hellip;

myClassA& myClassA;

делает экземпляры не присваиваемыми. И объект функтора & ldquo; должен & rdquo; быть назначаемым. Поэтому, если вы решите продолжить это, возможно, лучше заменить это на & hellip;

myClassA* pMyClassA_;

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

Приветствия & hth.,

...