完美的转发可变参数模板,为所选类型按值传递
Perfect forwarding variadic template with pass by value for selected types
有人提到 here and there 有时按值传递比按引用传递更可取。
鉴于此,是否可以 select 某些类型与完美转发可变参数模板一起按值传递?
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 内在特征,它也不是最优的......
有人提到 here and there 有时按值传递比按引用传递更可取。
鉴于此,是否可以 select 某些类型与完美转发可变参数模板一起按值传递?
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 内在特征,它也不是最优的......