gpt4 book ai didi

c++ - 通过 const& 或 && 传递模板参数

转载 作者:IT老高 更新时间:2023-10-28 23:21:14 24 4
gpt4 key购买 nike

我有这个示例程序:

#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;
});
}

I also posted it on Coliru.

如您所见,我使用不同的方式来传递参数:

  • 消息作为通用引用传递,因为它最终需要转发给 PrintImpl 函数。
  • 装饰在这里作为 const ref 传递,因为它的值被使用了两次,我不确定使用 forward 两次是否安全。 (它可能会被第一个前锋移开?)
  • PrintImpl 作为 const 引用传递,因为我看不到任何使用 forward 的理由。但是,我不确定这是否明智。 (我应该通过&&吗?如果是,我是否也应该使用std::forward?)

我的选择是否正确?

最佳答案

Am I making the right choices?

是的(大部分)。

Decoration is captured as const ref here because its value is used twice and I'm not sure if using forward twice would be safe. (It might be moved away by the first forward?)

当您多次使用 std::forward 时,不要使用它,这正是您布局的原因。

PrintImpl is captured as const reference because I don't see any reason to use forward.

您可能想要做的是采用 PrintImpl&& 并且不要使用 std::forward (将它们保留为左值),允许没有 const 的函数对象 - 限定 operator() 被传递。

关于c++ - 通过 const& 或 && 传递模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17853980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com