何时通过复制/参考?

问题描述 投票:4回答:1

假设我有两个模板用于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 {};

有没有办法改善病情?

c++ performance parameter-passing template-meta-programming
1个回答
1
投票

Some checks are redundant:

所有基本类型和指针类型也都是微不足道的。不可否认,一些基本类型可能比void*更大(指向成员/成员函数的指针,尽管它们可能更大,但未被std::is_pointer检测到)。

This is over-constraining:

通过简单的可复制就足够了,琐碎的默认构造性是无关紧要的。有人甚至可以说仅仅是琐碎的可破坏性就足够了。

template <class T>
using prefer_copy = std::bool_constant<std::is_trivially_copyable<T>() && sizeof(T) <= sizeof(std::max_align_t)>;

You will be writing the implementation twice

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

© www.soinside.com 2019 - 2024. All rights reserved.