我有这个示例程序:
#include <iostream>
template<typename Message, typename Decoration, typename PrintImpl>
void print_surrounded(Message&& msg, const Decoration& decoration, const PrintImpl& print_impl)
{
print_impl(decoration); // should forward be used?
print_impl(" ");
print_impl(std::forward<Message>(msg));
print_impl(" ");
print_impl(decoration);
}
template<typename Message, typename PrintImpl>
void pretty_print(Message&& msg, const PrintImpl& print_impl)
{
print_surrounded(std::forward<Message>(msg), "***", print_impl);
}
int main()
{
pretty_print("So pretty!", [](const char* msg) {
std::cout << msg;
});
}
如您所见,我使用不同的方式来传递参数:
- 消息作为通用引用传递,因为它最终需要转发到 PrintImpl 函数。
- 装饰在这里作为 const ref 传递,因为它的值被使用了两次,我不确定使用两次转发是否安全。(它可能会被第一个前锋移开?)
- PrintImpl 作为 const 引用传递,因为我看不到任何使用 forward 的理由。但是,我不确定这是否明智。(我应该过去
&&
吗?如果是,我也应该使用std::forward
吗?)
我是否做出了正确的选择?