У нас есть базовая функция, которая добавляет 2 числа с плавающей точкой (с определенной степенью точности).
float add(float x, float y)
{
std::cout << "\n in the add function \n";
float res = x+y;
std::cout << "\n exiting the add function \n";
return res;
}
У нас есть предварительное объявление
template <typename> struct Logger;
, за которым следует реализация,
template<typename R, typename... Args>
struct Logger<R(Args...)>
{
// these would be members
function<R(Args...)> func;
string name;
// this would be ctor
Logger(const function<R(Args...)>& func, const string& name)
:
func{func},
name{name}
{
}
// this would be the overload fun operator
R operator() (Args ...args) const
{
cout << "\n Entering Into ... .......\n" << name << endl;
R result = func(args...); // this would be actual call to the basic function
cout << "\n Exiting from ... \n" << name << endl;
return result; // this would be of type R, the return from the function call
}
};
У нас есть функция,
// This function would provide an instantiation of
// the Logger class,
// and that would call the ctor of the Logger class
template <typename R, typename... Args>
auto make_logger(R (*func)(Args...), const string& name )
{
return Logger<R(Args...)>{
std::function<R(Args...)>(func),
name
};
}
// Notice, there is no decltype in the above function, and I would like to use
// the decltype, I am aware that decltype cannot be used on packed template argument
// Здесь используется API в некоторой основной функции
auto logger_add = make_logger(add, "**Adding Numbers**");
auto result = logger_add(2.0, 3.0);
Проблема:
Можно ли заставить приведенный выше код работать на C ++ 11?В частности, используя declytype, как можно использовать функцию make_logger.
Примечания: я слежу за книгой, а вышеприведенный код взят из https://github.com/Apress/design-patterns-in-modern-cpp/blob/master/Structural/Decorator/decorator.cpp