【发布时间】:2019-09-01 05:19:22
【问题描述】:
假设我有两个模板用于 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 {};
有什么办法可以改善吗?
【问题讨论】:
-
如果按值传递和按引用传递的实现相同,您可以只使用
std::conditional_t来确定参数类型,而不是使用enable_if。优点是你只需要编写一次函数,避免自己重复。 -
没想到。但是,当我尝试它时,编译器无法推断出
argument T... -
这点很好,你不能直接进行模板推导,也不能显式地为运算符提供模板参数。您可以将
operator()完美地转发到实际实现该行为的私有函数,但那时我不确定它是否仍然值得。
标签: c++ performance parameter-passing template-meta-programming