У меня есть класс для хранения одной функции, и когда ее вызываемый хранит время работы функции. И это хорошо на функции возврата типа void. Но когда я хочу получить возвращаемый тип сохраненной функции, у меня есть «значение void, которое не игнорируется, как должно быть». Я не могу специализировать шаблон, потому что типы возврата не являются ковариантными (насколько я понимаю).измеряет время выполнения любых функций и возвращает возвращаемое значение функции
Таким образом, следующий класс является плохим.
class TimeDurationOperation {
public:
TimeDurationOperation(boost::function<void(void)> operation_)
: operation(operation_) { }
template <typename R> R operate() {
const boost::posix_time::ptime start =
boost::posix_time::microsec_clock::local_time();
R return_value = operation();
const boost::posix_time::ptime stop =
boost::posix_time::microsec_clock::local_time();
elapsed = stop - start;
return return_value;
}
boost::posix_time::time_duration elapsed_time() const {
return elapsed;
}
private:
boost::function<void(void)> operation;
boost::posix_time::time_duration elapsed;
};
Рабочие версии работают функции():
void operate() {
const boost::posix_time::ptime start =
boost::posix_time::microsec_clock::local_time();
operation();
const boost::posix_time::ptime stop =
boost::posix_time::microsec_clock::local_time();
elapsed = stop - start;
}
Я хочу назвать это так:
TimeDurationOperation tdo(boost::bind(detail::fun1, 2000));
tdo.operate();
std::cout << tdo.elapsed_time() << std::endl;
и
TimeDurationOperation tdo2(boost::bind(detail::fun2, 500));
int r = tdo2.operate<int>();
std::cout << tdo2.elapsed_time() << " and returned: " << r << std::endl;
Что ваши предложения?
Используйте 'template typename', а затем используйте 'T' вместо' ', возможно? Я не эксперт по шаблонам, поэтому я не уверен на 100%. –
Вы имели в виду, что я должен был бы подстроить свой класс TimeDurationOperation подписи функции? Потому что это не сработает, так как я вызываю объект функции следующим образом: 'operation()'. – spiralfuzet
Ну, это было мое предложение, да. Но если это не сработает, вам может понадобиться найти другой способ решить всю проблему ... –