Как передать указатель на функцию в шаблон? в избранное  новое горячее всё    подписка   модер. 
От: Слава 
Дата: 29.05.08 08:14
Например:

template<class TClass,class TPar>
class CExecutor
{
public:
    void setFunction(ULONG  (TClass::*pFunc)(TPar*))
    {
        this->pFunc=pFunc;
    }
    
    void ExecuteFunc(TPar params[])
    {
        TClass::*pThreadFunc(&params[0]);//error C2064: term does not evaluate to a function taking 1 arguments
    }
private:
    ULONG  (TClass::*pFunc)(TPar*);
};

class test
{
public:
    test()
    {
        Ex.setThreadFunction(&test::TestFunc);
    }
    void ExecTestFunc()
    {
        TestFuncParams par[1];
        par[0].bBolean=true;
        par[0].nInteger=50;
        par[0].ThreadNumber=10;

        Ex.ExecuteFunc(par);
    }
private:
    ULONG test::TestFunc(TestFuncParams* pPar)
    {
        return 0;
    }

    CExecutor<test,TestFuncParams> Ex;

};
Спасибо за внимание
Re: this->*pFunk(&params[0]); в избранное  новое    модер. 
От: Erop 
Дата: 29.05.08 08:19
Здравствуйте, Слава, Вы писали:

С>
С>        this->*pFunk(&params[0]);
С>

Скорее "как вызывать"
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: this->*pFunk(&params[0]); в избранное  новое    модер. 
От: Слава 
Дата: 29.05.08 08:23
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Слава, Вы писали:


С>>
С>>        this->*pFunk(&params[0]);
С>>



Это проблему не решило
E>Скорее "как вызывать"
Да ты прав
Спасибо за внимание
Re[3]: this->*pFunk(&params[0]); в избранное  новое    модер. 
От: Erop 
Дата: 29.05.08 08:26
Здравствуйте, Слава, Вы писали:

С>>>
С>>>        pTClass->*pFunk(&params[0]);
С>>>



С>Это проблему не решило

Упс, проглядел, что у тебя класс-то другой, не экзекутор.!!!
Вместо this надо использовать указатель на тот экземпляр TClass, метод которого ты хочешь позвать...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Как передать указатель на функцию в шаблон? в избранное  новое    модер. 
От: Bell 
Дата: 29.05.08 08:30
Здравствуйте, Слава, Вы писали:


Чтобы вызвать фунцию-член через указатель, нужно иметь объект, на котором будет производится вызов:

typedef unsigned long ULONG;

template<class TClass,class TPar>
class CExecutor
{
public:
    void setFunction(ULONG  (TClass::*pFunc)(TPar*))
    {
        this->pFunc=pFunc;
    }
    
    void ExecuteFunc(TClass* pObj, TPar params[])
    {
        (pObj->*pFunc)(&params[0]);//error C2064: term does not evaluate to a function taking 1 arguments
    }
private:
    ULONG  (TClass::*pFunc)(TPar*);
};

class TestFuncParams {};

class test
{
public:
    test()
    {
        Ex.setFunction(&test::TestFunc);
    }
    void ExecTestFunc()
    {
        TestFuncParams par[1];
        //par[0].bBolean=true;
        //par[0].nInteger=50;
        //par[0].ThreadNumber=10;

        Ex.ExecuteFunc(this, par);
    }
private:
    ULONG TestFunc(TestFuncParams* pPar)
    {
        return 0;
    }

    CExecutor<test,TestFuncParams> Ex;

};
Любите книгу — источник знаний (с) М.Горький
Re[4]: this->*pFunk(&params[0]); в избранное  новое    модер. 
От: Слава 
Дата: 29.05.08 08:33
Здравствуйте, Erop, Вы писали:

E>Упс, проглядел, что у тебя класс-то другой, не экзекутор.!!!

E>Вместо this надо использовать указатель на тот экземпляр TClass, метод которого ты хочешь позвать...

ОК, написал так:

emplate<class TClass,class TPar>
class CExecutor
{
public:
void setFunction(ULONG (TClass::*pFunc)(TPar*))
{
this->pFunc=pFunc;
}

void ExecuteFunc(TPar params[],TClass* caller)
{
caller->*pTFunc(&params[0]);//error C2064: term does not evaluate to a function taking 1 arguments
}
private:
ULONG (TClass::*pFunc)(TPar*);
};

class test
{
public:
test()
{
Ex.setThreadFunction(&test::TestFunc);
}
void ExecTestFunc()
{
TestFuncParams par[1];
par[0].bBolean=true;
par[0].nInteger=50;
par[0].ThreadNumber=10;

Ex.ExecuteFunc(par,this);
}
private:
ULONG test::TestFunc(TestFuncParams* pPar)
{
return 0;
}

CExecutor<test,TestFuncParams> Ex;

};
Всё тоже самое
Спасибо за внимание
Re[5]: this->*pFunk(&params[0]); в избранное  новое    модер. 
От: Bell 
Дата: 29.05.08 08:37
Оценка:3 (1)
Здравствуйте, Слава, Вы писали:

Не забываем про скобочки
(caller->*pTFunc)(&params[0]);
Любите книгу — источник знаний (с) М.Горький
Re[5]: this->*pFunk(&params[0]); в избранное  новое    модер. 
От: Erop 
Дата: 29.05.08 08:50
Оценка:3 (1)
Здравствуйте, Слава, Вы писали:

С>        (caller->*pTFunc)(&params[0]);//error C2064: term does not evaluate to a function taking 1 arguments
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: this->*pFunk(&params[0]); в избранное  новое    модер. 
От: Слава 
Дата: 29.05.08 09:26
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Слава, Вы писали:


B>Не забываем про скобочки

B>
B>(caller->*pTFunc)(&params[0]);
B>


Спасибо
Спасибо за внимание
Re[6]: this->*pFunk(&params[0]); в избранное  новое    модер. 
От: Слава 
Дата: 29.05.08 09:26
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Слава, Вы писали:


E>
С>>        (caller->*pTFunc)(&params[0]);//error C2064: term does not evaluate to a function taking 1 arguments
E>


Спасибо
Спасибо за внимание