2

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;

あなたの提案は何ですか?

4

2 に答える 2