指针的部分特化,c++

发布于 2024-10-13 06:52:53 字数 267 浏览 3 评论 0原文

如何对 GList 类进行部分特化,以便可以存储 I (即 I*) 的指针?

template <class I>
struct TIList
{
    typedef std::vector <I> Type;
};


template <class I>
class GList
{
      private:
            typename TIList <I>::Type objects;
};

How to make partial specialization of the class GList so that it is possible to store pointers of I (i.e I*) ?

template <class I>
struct TIList
{
    typedef std::vector <I> Type;
};


template <class I>
class GList
{
      private:
            typename TIList <I>::Type objects;
};

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

枕梦 2024-10-20 06:52:53

您无需专门化即可实现这一点。它已经可以存储指针了。

GList<int*> ints;

无论如何,如果您想将 GList 专门用于指针,请使用以下语法。

template <class I>
class GList<I*>
{
    ...
};

然后就像在任何普通模板中一样使用 I 。在上面的 GList 示例中,将使用指针专门化,并且 I 将是 int

You don't need to specialise to allow that. It can store pointers already.

GList<int*> ints;

Anyway, if you wanted to specialise GList for pointers, use the following syntax.

template <class I>
class GList<I*>
{
    ...
};

Then just use I as you would in any normal template. In the example above with GList<int*>, the pointer specialisation would be used, and I would be int.

塔塔猫 2024-10-20 06:52:53

上一篇文章指出,您不需要专门研究指针类型,但您可以。

请考虑以下事项:

struct Bar {
    void bar(void) { /* do work */ }
};

template <class T> struct Foo {
    T t;

    void foo(void)
    {
        t.bar(); // If T is a pointer, we should have used operator -> right?
    }
};

int main(int argc, char * argv[])
{
    Foo<Bar *> t;

    t.foo();
}

这不会编译。因为在 Foo::foo 中我们有一个指针,但我们将它用作变量。

如果添加以下内容,它将使用专业化并正常编译:

// This is a pointer to T specialization!
template <class T> class Foo<T *> {
    T * t;
public:
    void foo(void)
    {
        t->bar();
    }
};

Previous post states that you don't NEED to specialize for pointer types, but you might.

Consider the following:

struct Bar {
    void bar(void) { /* do work */ }
};

template <class T> struct Foo {
    T t;

    void foo(void)
    {
        t.bar(); // If T is a pointer, we should have used operator -> right?
    }
};

int main(int argc, char * argv[])
{
    Foo<Bar *> t;

    t.foo();
}

This won't compile. Because in Foo::foo we have a pointer yet we use it as variable.

If you add the following, it will use the specialization and compile fine:

// This is a pointer to T specialization!
template <class T> class Foo<T *> {
    T * t;
public:
    void foo(void)
    {
        t->bar();
    }
};
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文