1 つの関数を格納するクラスがあり、それが呼び出されると、関数の実行時間が格納されます。そして、それは 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;
};
ワーキングバージョンoperate()関数:
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;
あなたの提案は何ですか?