统一常量 T& 和 T&& 重载
unifying const T& and T&& overloads
我有以下两个函数模板重载:
template<typename T>
optional<T> some(const T& x)
{
return optional<T>(x);
}
template<typename T>
typename std::enable_if<std::is_rvalue_reference<T&&>::value, optional<T> >::type
some(T&& x)
{
return optional<T>(std::move(x));
}
我第一次尝试通过完美转发统一重载失败了:
template<typename T>
optional<T> some(T&& x)
{
return optional<T>(std::forward<T>(x));
}
error: forming pointer to reference type 'const std::basic_string<char>&'
就像我的第二次尝试一样:
template<typename T>
optional<typename std::remove_reference<T>::type> some(T&& x)
{
return optional<typename std::remove_reference<T>::type>(std::forward<T>(x));
}
error: no matching function for call to
'std::basic_string<char>::basic_string(gpa::optional<const std::basic_string<char> >)'
有没有一种干净的方法来统一过载,或者我应该忍受它们?
我不熟悉你的optional
,但也许你需要补充:
typename remove_const< ... >::type
在你的remove_reference
周围有两个地方。 (因为您的 2 重载解决方案的第一次重载 - 我假设它通过了您的所有测试 - 在声明 optional<T>
时有效地执行了remove_const
)。
通常,执行此操作的最佳方法是按值获取对象,并让调用方决定是复制还是移动它:
template<typename T>
optional<T> some(T x)
{
return optional<T>(std::move(x));
}
如果调用方使用临时调用它或对其值使用 std::move
,则会移动它。否则,它将被复制。
是的,这确实意味着您将执行一个额外的移动(如果移动与复制相同,则意味着执行两个副本)。如果这对您来说是一个重大的性能问题,则必须使用两个重载实现。
相关文章:
- 什么时候可以使用常量装饰调用我的重载函数?
- 如何为非常量和常量重载实现一次成员函数?
- 一种优雅或至少可行的方法,用于使用和接受具有重载方法和运算符的不同大小的文字数组常量
- 重载模板化类的[]运算符的常量版本
- 获取对常量规范重载的成员函数的引用
- C++ 具有常量数组和initializer_list的重载构造函数
- 如何让编译器在C++中更喜欢常量方法重载?
- 重载、常量参数、const_cast、const_cast<字符串 &>
- 引用模板类型的赋值运算符需要非常量重载
- 封装 ublas 并将常量引用重载到 operator()
- 如何在 C++ 类中重载 'less than' 运算符以比较常量?
- 为什么重载"<<"需要一个常量参数?
- MSVC:推理指向具有常量和非常量重载的成员函数的指针
- 常量字符数组模板与字符常量* 函数重载
- 防止将临时传递为常量引用的方法,该方法比删除 r 值重载更好地缩放
- 函数重载与常量
- 重载常量和非常量转换运算符返回数组类型时出现 MSVC 错误 C2593
- 为什么要在具有多个参数的重载运算符+中传递常量引用
- 运算符 [] 重载常量引用二维指针
- 单元测试-在C++TDD中调用重载常量与非常量方法的好方法