2013-03-19 2 views
3

Извините за длинный и запутанный титул! Вот моя проблема: я пытаюсь написать функцию для вывода времени, которое выполняет другая функция. Обычно я просто передавал функцию и ее аргументы, но в этом случае функции, которые я пытаюсь сам забрать, принимают функции в качестве аргументов.Как объявить функцию, которая принимает функцию с функцией в качестве аргумента?

Для конкретного примера, я пытаюсь получить эту работу:

void foo(void (*f) (T*)){ 
    ...function stuff... 
} 

        --------not sure what this should be 
       | 
void runWithTime(void (*f) (void (*g) (T*))){ 
    f(g) 
} 

//runWithTime(foo); 

Я хочу, чтобы быть в состоянии назвать runWithTime(foo), но я не уверен, что тип runWithTime «S аргумент должен быть ,

Любая помощь будет замечательной! Заранее спасибо.

+0

Выглядит хорошо, какая ошибка вы получаете? –

+0

«g не был объявлен в этой области», когда я называю 'f (g)' –

+0

'void (*) (T *)' вместо 'void (* g) (T *)' Я думаю, –

ответ

5

Простое решение:

template<typename T> 
auto runWithTime0(T _func) -> decltype(_func()) 
{ 
    startTimer(); 
    _func(); 
    endTimer(); 
} 

template<typename T, typename P1> 
auto runWithTime1(T _func, P1 _arg1) -> decltype(_func(_arg1)) 
{ 
    startTimer(); 
    _func(_arg1); 
    endTimer(); 
} 

// ...etc 

Вы можете сделать что-то подобное с буст :: связывают и то, что не так хорошо, но если это не доступно выше следует сделать трюк.

Edit: добавленную стоимость возврата, который будет работать, если ваш компилятор поддерживает C++ 11 (VC2010/2012, г ++ 4.7 или выше, я считаю)

1

Как это происходит, я написал код для почти точно та же самая цель в последнее время. То, что я придумал это было:

template <class F, class T> 
void timer(F f, T &t, std::string const &title) { 
    unsigned count; 
    clock_t start = clock(); 
    result = f(t, 'N'); 
    clock_t stop = clock(); 
    std::cout << std::left << std::setw(30) << title << "\tResult: " << result; 
    std::cout << "\tTime: " << double(stop-start)/CLOCKS_PER_SEC << "\n"; 
} 

Использовались как: timer(function1, infile, "Running function 1");

2

При вызове runWithTime(foo) вы передавая ему указатель на функцию, которая является параметром f, но вы не поставляя g, поэтому вы не можете позвонить f(g) ... что это значит?

Чтобы сделать вашу жизнь проще использовать некоторые определения типов:

// A pointer to a function that takes a single T* argument 
typedef void (*func_ptr)(T*); 

void foo(func_ptr f){ 
    ...function stuff... 
} 

// A pointer to a function that takes a single func_ptr argument 
typedef void (*funcfunc_ptr)(func_ptr); 

void runWithTime(funcfunc_ptr f, func_ptr g){ 
    f(g) 
} 

Теперь должно быть очевидно, что вам нужно передать два аргумента runWithTime, например, runWithTime(foo, NULL) или runWithTime(foo, bar), где bar является функцией с подписью void bar(T*)

Смежные вопросы