c++ - 完美的转发可变参数模板,为所选类型按值传递

标签 c++ templates perfect-forwarding

提到herethere有时按值传递比按引用传递更可取。

有鉴于此,是否可以结合完美的转发可变参数模板选择一些类型进行值传递?

template<typename... Args>
void foo(Args&&...);  // passes everything by reference

template<typename... Args>
void foo(Args...);  // passes everything by value

template<typename... Args>
void foo(std::conditional_t<is_selected_v<Args>, Args, Args&&>...); // won't deduce types

template<typename... Args>
void foo(...);  // this is wrong :)

请注意,无法推导类型意味着它不适用于构造函数

最佳答案

我认为我们能做的最好的事情是

template<typename T>
using pass_policy_t = std::conditional_t<
  std::is_scalar<std::decay_t<T>>::value,
    std::decay_t<T>,
    T&&>;

template<typename... Args>
void foo_impl( pass_policy_t<Args>... );

template<typename... Args>
inline void foo( Args&&... args )
{
  foo_impl<Args...>( std::forward<Args>(args)... );
}

其中 pass_policy_t 计算实际的传递类型(在上面的示例中,标量类型衰减)。当然,不能保证 foo 会被优化,无论如何我很高兴看到它没有被优化的合理情况...... :) 这里是 live snippet尝试...

为了完整起见,有一个关于这个问题的标准提案(n3445)但它似乎无处可去......无论如何,1)它支持怀疑目前没有更多语言支持是不可能的,2)它表明即使有一个完全由程序员控制的按值传递策略,如果没有像 is_fast_pass 内在特征这样的东西,它也不是最优的......

关于c++ - 完美的转发可变参数模板,为所选类型按值传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46723462/

相关文章:

c++ - 将模板化参数类型转换为字符串

C++完美转发: how to avoid dangling references

c++ - 传递成员函数作为参数/c++

c++ - 模板 vector <typename>迭代器的NULL/默认值

java - 解决 Play 2 Java Framework 中子项目和根项目之间的模板名称冲突

c++ - 从 std::array 等获取 size_type 的惯用方法

c++ - 完美转发复制的 std::tuple

c++ - 在方法调用中是否有在该对象上调用 std::forward 的感觉(与参数相反)?

c++ - 如何在 "native c++"环境中使用 WinRT IAsyncOperation* 对象

c++ - 根据内存位置对两个链表进行排序