何时通过副本/参考?
When to pass by copy / reference?
假设我有两个用于operator=
重载的模板:
class MyClass {
public:
template <typename T>
std::enable_if_t<true == /* a condition */, MyClass&>
operator=(T value) {
std::cout << "Pass by copy" << std::endl;
}
template <typename T>
std::enable_if_t<false == /* a condition */, MyClass&>
operator=(const T &value) {
std::cout << "Pass by reference" << std::endl;
}
};
与std::enable_if
一起使用的最佳条件是什么?
我想出了这个:
template <typename T>
struct pass_copy_cond : std::conditional<
std::is_fundamental<T>::value ||
std::is_pointer<T>::value ||
(std::is_trivial<T>::value && sizeof(T) < sizeof(void*))
, std::true_type, std::false_type>::type {};
有没有办法改善病情?
某些检查是多余的:
所有基本类型和指针类型也是微不足道的。诚然,一些基本类型可能大于void*
(指向成员/成员函数的指针,尽管它们可能更大,但未被std::is_pointer
检测到)。
这是过度约束:
琐碎的可复制性就足够了,琐碎的默认可构造性是无关紧要的。人们甚至可以提出一个理由,仅凭微不足道的可破坏性就足够了。
template <class T>
using prefer_copy = std::bool_constant<std::is_trivially_copyable<T>() && sizeof(T) <= sizeof(std::max_align_t)>;
您将编写两次实现
如果您的编译器允许您强制内联(不是标准化的,但几乎每个编译器都以某种方式允许它),则可以委托给该单一的通用实现并使其内联。
相关文章:
- C++错误消息*成员参考.**初学者*
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 参考资源文件VC++中的$(SolutionDir)
- 用callgrind追踪不必要的副本
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 检查注册表项是否链接到(或副本)另一个注册表项
- 为什么在运算符重载时需要参考?
- 使 \page 和 \subpage 参考 doxygen 中的方法文档
- 为什么构建目录中新构建的共享库与安装目录中的副本具有不同的依赖项集?
- C++基于范围的 for 循环和元素副本
- 创建提升::shared_ptr的深层副本
- C 标准:通过复制返回以初始化无RVO的参考:是否有任何副本
- 是否有一种方法可以始终通过值(制作副本)而不是在使用类成员函数时通过参考来传递
- 何时通过副本/参考?
- 我可以返回副本作为参考吗?
- 产生副本作为输入,以获取RVALUE参考
- 替代STD ::向量存储参考而不是对象的副本
- 参考参数返回副本