如何基于指针与非指针类型重载成员函数

How to overload a member function based on pointer vs non-pointer type

本文关键字:指针 重载 成员 类型 函数 何基于      更新时间:2023-10-16

给定以下情况:

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。