c++ - 什么时候通过复制/引用?

标签 c++ performance parameter-passing template-meta-programming

假设我有两个用于 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)>;

你将编写两次实现

如果您的编译器允许您强制内联(不是标准化的,但几乎每个编译器都以某种方式允许),您可以委托(delegate)给那个单一的通用实现并使其内联。

关于c++ - 什么时候通过复制/引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55617795/

相关文章:

c++ - 如何允许某些类的对象访问另一个类的对象的 protected 成员

c++ - 从 Visual C++ 资源文件获取 FILEVERSION

Java - 参数和增强的 For 循环复制问题

javafx - 传递参数JavaFX FXML

c++ - 如何从运行时参数初始化常量全局变量?

c++ - OpenCV凸缺陷绘图

c++ - C++如何用雅可比法求解n个方程?

php - 如何用PHP检测网速?

c++ - C++中的分页效果是什么?

2个列表的Python组合