c++ 如何在模板中使用派生指针,并以常量指针作为参数

db2dz4w8  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(112)

我想定义一个模板类,它接受一个全局指针作为模板参数,就像一个 null-element。当指向空元素的指针的类型相同时,下面的代码工作:h<a *, &nullelem0> n0;。但是,我希望能够使用从基类a派生的空元素。在这种情况下,h<a *, &nullelem1> n1;失败:

62_temp.cpp:31:22: error: could not convert template argument ‘& nullelem1’ from ‘b*’ to ‘a*’
     h<a *, &nullelem1> n1;

这是可以理解的所以我试着:

h<a *, (a*)&nullelem1> n1;

这导致:

62_temp.cpp:31:26: error: ‘& nullelem1.b::<anonymous>’ is not a valid template argument of type ‘a*’ because ‘nullelem1.b::<anonymous>’ is not a variable
     h<a *, (a*)&nullelem1> n1;
  • 是否有一种方法可以指定模板在示例化时接受派生类指针?*
class a {
public:
    a(int v) : v(v) {};
    int v;
};
class b : public a {
public:
    b(int v) : a(v) {};
};
class c : public a {
public:
    c(int v) : a(v) {};
};
a nullelem0(1);
b nullelem1(1);

template <typename _Tp, _Tp n>
class h
{
public:
    bool isnull(_Tp a) { return a == n; }
};

int main(int argc, char **argv) {

    h<a *, &nullelem0> n0;
    c p1(2);
    n0.isnull(&nullelem0);
    n0.isnull(&p1);

    /* this one fails: */
    h<a *, &nullelem1> n1;

    return 0;
}
wlwcrazw

wlwcrazw1#

如何做以下几点:

template <typename _Tp, _Tp n, typename base= _Tp>
    class h
    {
    public:

        bool isnull(base a) { return a == n; }
    };
int main() {
...
c p1(2);
h<b *, &nullelem1, a*> n1;
    n1.isnull(&p1);
return 0;
}

注意非类型模板参数的不可转换性,但仍使其与任何基址指针兼容。

相关问题