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

时间:2019-04-10 16:57:21

标签: 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 {};

有没有改善病情的方法?

1 个答案:

答案 0 :(得分:1)

有些检查是多余的:

所有基本类型和指针类型也是微不足道的。不可否认,某些基本类型可能比ClientAliveInterval大(成员/成员函数的指针虽然可能更大,但ClientAliveInterval却无法检测到)。

这是过度约束:

琐碎的复制就足够了,琐碎的默认可构造性无关紧要。甚至可能仅凭琐碎破坏就足够了。

ServerAliveInterval

您将编写两次实现

如果您的编译器允许您强制进行内联(未标准化,但几乎每个编译器都以某种方式允许这样做),则可以委派给该单一的常见实现并使其内联。