Использование типа указателя на функцию в качестве аргумента шаблона - PullRequest
2 голосов
/ 19 декабря 2009

Я пытаюсь написать шаблон, который получает тип указателя функции в качестве аргумента шаблона и соответствующий указатель функции в качестве аргумента функции, поэтому в качестве простого примера я делаю это сейчас:

int myfunc(int a)
{ return a; }

template<typename T, typename Func> struct Test
{
    typedef typeof(myfunc) Fun;
    static T MyFunc(T val, Func f)
    {
        return f(val);
    }
};

int main(void)
{
    std::cout<<Test<int, typeof(myfunc)>::MyFunc(5, myfunc)<<std::endl;
}

Однако этот код мгновенно вылетает. Если я изменю тип f на Fun, он будет работать отлично. Так что я делаю не так и как мне заставить это работать?

Я использую Mingw под Windows Vista, если это поведение в случае, если это поведение зависит от компилятора.

Ответы [ 2 ]

2 голосов
/ 19 декабря 2009

Вам не нужен класс Test для этого сценария, и зачем здесь использовать функцию typeof?

template< typename T, typename fT > 
T TestMyFunc( T t, fT f ) {
   return f(t);
};

будет делать, и не тратить время на указатели типов функций:

std::cout << TestMyFunc(5,myfunc) << std::endl;

Аргументы шаблона выводятся автоматически для функций!

2 голосов
/ 19 декабря 2009

typeof не является допустимым C ++, но если я заменю ваши две строки, включающие их, на эти, то ваш код будет нормально работать с Fun или Func в определении MyFunc.

typedef int (*Fun)(int);

и

std::cout<<Test<int, int(*)(int)>::MyFunc(5, myfunc)<<std::endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...