【问题标题】:C++ Templates - Passing Class member [closed]C ++模板-传递类成员[关闭]
【发布时间】:2013-03-29 04:30:15
【问题描述】:

好吧,伙计们!

我在这里遇到了一个小问题,为了简单起见,它或多或少是这样的:

window.h

template <ObjectType &x>
class foo { stuff }

游戏.h

class gameclass { ObjectType a; }

main.cpp

gameclass mygame;
foo<mygame.a> fooa;

现在 fooa 失败了,因为它不允许我将 mygame 的成员 'a' 作为模板参数发送。

现在如何将类成员作为模板参数发送?

谢谢

【问题讨论】:

  • 这没有意义。模板参数应该是一个type,而不是一个对象。如果您想要atype,那么只需执行foo&lt;ObjectType&gt; fooa;
  • 你忘记阅读你的 C++ 书了。
  • @MiguelP:投反对票不是一种粗鲁的方式(或者至少不应该这样使用它们)。如果您将鼠标悬停在 downvote 按钮上,您应该会看到一个工具提示,其中列出了 3 个可能的 downvote 动机:没有研究工作(任何关于模板的书都告诉您您正在尝试做的事情是无意义的),不清楚(并且您的问题确实是,因为根本没有显示“东西”部分),或者没有用(我个人认为这没有用)。所以对我来说,所有三个不赞成投票的标准都得到了满足。我投了反对票,但我这样做并不是因为粗鲁。
  • @Walter 你是对的,但是 sftrabbit 用问题的第一个修订版写了他的评论,指定&lt;class x&gt; ;)
  • @Walter 哈哈,没关系。我认为发布到旧修订版的 cmets(和答案)旁边应该有一些修订参考,您可以点击查看差异。

标签: c++ class templates member


【解决方案1】:

您似乎想传递一个非类型模板参数,更具体地说,是一个指向成员的指针。对于你想要的,你必须用户:

template<ObjectType gameclass::* ptr>
struct foo
// ...

请注意,只有当您拥有指向该对象的指针时,您才能访问该对象的成员。

您可以了解更多详情here (pointer-to-member as template parameter)here (pointer-to-members)

请注意,您不能将mygame.a 的值传递给您发布的代码中的模板,因为:

  1. 模板参数是编译时的,你的值是运行时的。
  2. 非类型模板参数不能是任何对象类型,只能是整数(或枚举)、对象/函数的指针/引用或成员指针。

编辑: 您已将模板更改为template&lt;ObjectType&amp; x&gt;。这对于reference to object 是正确的。但是,mygame.a 不是参考,它是一个值。要指定成员,您必须使用语法&amp;mygame::a,这会强制您使用指向成员的指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多