如何基于指针与非指针类型重载成员函数
How to overload a member function based on pointer vs non-pointer type
给定以下情况:
template <typename T>
class Whatever
{
public:
Whatever(T &&t): _t(std::move(t)) { }
private:
T _t;
};
当T
是指针类型时,我需要检查构造函数的t
参数,看看它是否是-1
(不要问(,并在将其分配给_t
之前将其更改为nullptr
。换句话说,我需要为指针类型重载此构造函数。
有人知道这是否可行吗?
注意:即使我在指针类型上对类进行了部分专门化,如果可能的话,我也希望该类从上面的类本身继承(因为除此之外,两个类的行为都是相同的(,但不知道这是否可能。如有任何帮助,我们将不胜感激。谢谢
您可以使用标记调度和委派构造函数:
#include <type_traits>
template <typename T>
class Whatever
{
public:
Whatever(T&& t)
: Whatever(std::move(t), std::is_pointer<T>{})
{
}
private:
Whatever(T&& t, std::true_type)
: _t(/*initialize _t as a pointer*/)
{
}
Whatever(T&& t, std::false_type)
: _t(/*initialize _t as a non-pointer*/)
{
}
T _t;
};
您可以考虑使用std::enable_if<...>
并处理重载集。更容易而不是专门化构造函数,并以不同的方式进行适当的转换:
template <typename T>
class WhateverBase {
protected:
T _t;
WhateverBase(T&& t): _t(std::move(t)) {}
};
template <typename T>
class WhateverBase<T*> {
protected:
T* _t;
WhateverBase(T* t): _t(adjust(t)) {}
};
template <typename T>
class Whatever: WhateverBase<T>
{
public:
Whatever(T&& t): WhateverBase(std::move(t)) {}
// ...
};
上面的逻辑假设Whatever
中有额外的代码,这些代码在使用不同类型T
的版本之间共享,不应该复制。
或者,也可以创建move()
的自定义版本,该版本执行以下逻辑:
template <typename T>
std::remove_reference_t<T>&& adjust_move(T&& ref) {
return static_cast<std::remove_reference_t<T>&&>(ref);
}
template <typename T>
T* adjust_move(T* ref) { return adjust(ref); }
Whatever<T>::Whatever(T&& t): _t(adjust_move(t)) {}
(实际上,这种方法更简单…(。
并使用它来代替构造函数中的CCD_ 10。
相关文章:
- C++指针复制重载
- 如何在基类指针向量的元素上应用重载的多态函数
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 指向重载静态成员的函数指针 - 在unique_ptr中用作自定义删除器
- 重载 ostream << 运算符,指针作为参数,导致输出上的内存地址
- 使用类指针重载C++命名空间函数模板专用化替代方法?
- 类重载运算符 '<' 插入指向该对象集的共享指针时不调用
- 使用继承的指针列表复制构造函数或重载运算符=
- 为指针重载运算符++
- 如何从模板类重载创建的指针对象上的运算符?
- 用指针重载运算符+
- 函数指针重载函数
- 函数指针重载错误
- 矢量可以包含一个智能指针,该指针重载运算符&?
- 模板函数指针重载
- C++:使用函数指针重载<<运算符
- 将nullptr参数委托给模板代码中的指针重载
- 用模板和指针重载数组操作符
- STL优先级队列和指针重载