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
我已经阅读了有关完美转发的内容,但仍有疑问)
考虑这段代码
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