Я пытаюсь создать функцию-оболочку для пересылки, которая время вызова функции в c ++ 14 . Есть 2
типы, с которыми мне нужно иметь дело,
Могут быть операции, которые мне нужно сделать до и после вызова, который я здесь пропускаю, поэтому я не могу просто вернуть func()
, который касается обоих *Типы 1017 * и non-void
.
Вот оболочка для функции void
.
template<typename T, typename ...U>
auto time_function(T&& func, U&& ...args) -> typename enable_if<is_same<decltype(func(args...)), void>::value>::type
{
std::cout << "timing void function" << std::endl;
std::forward<T>(func)(std::forward<U>(args)...);
std::cout << "timing over" << std::endl;
}
Упаковщик для функции non-void
template<typename T, typename ...U>
auto time_function(T&& func, U&& ...args) -> typename enable_if < !is_same<decltype(func(args...)), void), decltype(func(args...)) > ::value > ::type
{
std::cout << "timing returning function" << std::endl;
auto val = std::forward<T>(func)(std::forward<U>(args)...);
std::cout << "timing over" << std::endl;
return val;
}
int main()
{
time_function(foo, 2);
int i = time_function(&foo_return, 1); //this generates an error
//std::cout<<i<<std::endl;
}
foo
- это функция, которая возвращает void
, а foo_return
возвращает целое число. Генерируемая ошибка:
<source > :28 : 129 : error : template argument 1 is invalid
auto time_function(T && func, U && ...args) -> typename enable_if<!is_same<decltype(func(args...)), void>, decltype(func(args...))>::value > ::type
^
<source>:28 : 55 : error : expected nested - name - specifier before 'enable_if'
auto time_function(T && func, U && ...args) -> typename enable_if<!is_same<decltype(func(args...)), void>, decltype(func(args...))>::value > ::type
^ ~~~~~~~~
<source>:28 : 129 : error : template argument 1 is invalid
auto time_function(T && func, U && ...args) -> typename enable_if<!is_same<decltype(func(args...)), void>, decltype(func(args...))>::value > ::type
^
<source>:28 : 129 : error : template argument 1 is invalid
<source> : 28 : 129 : error : template argument 1 is invalid
<source> : 28 : 55 : error : expected initializer before 'enable_if'
auto time_function(T && func, U && ...args) -> typename enable_if<!is_same<decltype(func(args...)), void>, decltype(func(args...))>::value > ::type
^ ~~~~~~~~
<source>: In function 'int main()' :
<source> : 42 : 41 : error : no matching function for call to 'time_function(int (*)(int), int)'
int i = time_function(&foo_return, 1); //error -
^
<source>:20 : 6 : note : candidate : template<class T, class ... U> typename std::enable_if<std::is_same<decltype (func(time_function::args ...)), void>::value>::type time_function(T&&, U && ...)
auto time_function(T && func, U && ...args) -> typename enable_if<is_same<decltype(func(args...)), void>::value>::type
^ ~~~~~~~~~~~~
<source> : 20 : 6 : note : template argument deduction / substitution failed :
<source> : In substitution of 'template<class T, class ... U> typename std::enable_if<std::is_same<decltype (func(time_function::args ...)), void>::value>::type time_function(T&&, U&& ...) [with T = int (*)(int); U = {int}]' :
<source> : 42 : 41 : required from here
<source> : 20 : 6 : error : no type named 'type' in 'struct std::enable_if<false, void>'
Насколько мне известно, оболочка верна, что не так? Я проверяю, является ли возвращаемый тип функции void
, используя is_same
, и если да, объявляю желаемый тип возврата, используя enable_if
.