C++完美转发功能

C++ Perfect Forwarding function

我已经阅读了有关完美转发的内容,但仍有疑问)

考虑这段代码


template<typename Input , typename Output>
struct Processor 
{
    Output process(Input&& input)
    {
        startTimer(); // Starting timer
        auto data = onProcess(std::forward<Input>(input)); // Some heavy work here
        stopTimer(); // Stopping timer
        logTimer(); // Logging how many ms have passed
        return data;
    }

protected:
    Output onProcess(Input&& input) = 0; // one overload for rvalue-references
    Output onProcess(const Input& input) = 0; // one overload for const lvalue-references
};

我的问题是 onProcess(Input&& input)onProcess(const Input& input) 总是 做同样的事 。我怎样才能为 const 左值引用rvalue 引用 都设置一个重载,将有一个 const 左值引用 耗费了我的内存和性能?另外,如果我的 onProcess(Input& input) 过载怎么办,那我该如何解决我的问题呢?

更新

我的示例没有使用完美转发,因此我已根据问题的正确上下文对其进行了更正

template<typename Input , typename Output>
struct Processor 
{

    template<class I, 
    std::enable_if_t<std::is_same_v<std::decay_t<I>, Input>, int>=0>
    Output process(I&& input)
    {
        startTimer(); // Starting timer
        auto data = onProcess(std::forward<I>(input));
        stopTimer(); // Stopping timer
        logTimer(); // Logging how many ms have passed
        return data;
    }
protected:
    Output onProcess(Input&& input) = 0; // one overload for rvalue-references
    Output onProcess(const Input& input) = 0; // one overload for const lvalue-references
};

当你有 forwarding reference.

时,完美转发是可能的

示例:

template<class I, std::enable_if_t<std::is_convertible_v<I, Input>, int> = 0>
Output process(I&& input)
{
    startTimer(); // Starting timer
    auto data = onProcess(std::forward<I>(input));
    stopTimer(); // Stopping timer
    logTimer(); // Logging how many ms have passed
    return data;
}

至于 virtual 函数 onProcess,由于 virtual 函数不能作为函数模板,因此您不能在那里使用类似的结构。由于两个重载都应该在不更改对象的情况下做同样的事情,因此只创建其中一个函数并采用 const&.

Intput