问题标签 [member-pointers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2594 浏览

c++ - 获取成员 memberpointer 指向的类型

我想提取成员指针指向的成员的类型。

我尝试decltype按照评论中的建议使用,但是我对此有疑问:

buffer是一个std::shared_ptr<std::vector<uint8_t>>
someTypeuint32_t

我收到以下错误消息:

错误:从类型'__gnu_cxx::__alloc_traits >::value_type {aka unsigned char}'到类型'uint32_t& {aka unsigned int&}'的无效静态转换</p>

据我了解decltype(instance.*member)member定义为uint32_t instance::*member产生参考 uint32_t&而不是uint32_t. 我试图按值传递实例,但错误仍然存​​在。但是,我知道std::remove_reference,我首先不明白参考是如何出现的。

如果我可以在someType没有类实例的情况下提取 ,进一步的改进将是。但是我不知道如何实现这一点,而我可以通过 std lib 获得没有指针的类,例如:

我不知道如何以我可以在someType不知道课程的情况下获得课程的一部分的形式编写此内容。我可以写类似下面的东西,但是我仍然必须明确地传递类 naem 和 typename,有没有办法自动提取这些?此外,以下内容首先没有编译(http://ideone.com/8VlKO4):#include using namespace std;

0 投票
4 回答
808 浏览

c++ - 匹配继承的成员函数的类型

我有以下代码片段,无法编译。

&B::foo由于解析为,因此无法编译&A::foo,因此无法匹配建议的类型void (B::*)()。由于这是我用来检查非常具体的接口的 SFINAE 模板的一部分(我正在强制使用特定的参数类型和输出类型),我希望它能够独立于继承工作,同时保持检查的可读性。

我尝试过的包括:

  • 铸造论点的第二部分:

    helper<void (B::*)(), (void (B::*)())&B::foo> does_not_compile;

    不幸的是,这无济于事,因为第二部分现在不被识别为常量表达式,并且失败了。

  • 我已经尝试将引用分配给一个变量,以检查这一点。

    constexpr void (B::* p)() = &B::foo; helper<void (B::* const)(), p> half_compiles;

    此代码被clang 3.4接受,但g++ 4.8.1拒绝它,我不知道谁是对的。

有任何想法吗?

编辑:由于许多评论都要求更具体的问题版本,我会在这里写:

我正在寻找的是一种明确检查类是否尊重特定接口的方法。此检查将用于验证模板化函数中的输入参数,以便它们尊重这些函数所需的协定,以便在类和函数不兼容的情况下提前停止编译(即类型特征类型的检查)。

因此,我需要能够验证我请求的每个成员函数的返回类型、参数类型和数量、常量等。最初的问题是我用来验证匹配的更大模板的检查部分。

0 投票
2 回答
985 浏览

c++ - 成员变量指针

对于给定的结构:

我可以为函数创建一个调用 wapper:std::mem_fn( &foo::fooFunc )这样我就可以将它传递给另一个方法并在一个对象上调用它。
我想知道是否有类似的调用包装器,但用于成员变量。

例如,我在这里使用指向成员变量的指针,但我想使用调用包装器:

0 投票
1 回答
321 浏览

c++ - C++ 严格的别名规则和指向成员的指针

以下代码在 G++ 中产生警告:

无论如何它都能正常工作,但这让我担心。

您的意见是,这些“子成员”指针是否比普通成员指针更容易受到更严格的别名问题的影响?

0 投票
1 回答
116 浏览

c++ - 派生类不能使用成员指针指向受保护的基类成员

我不明白为什么我的派生类型不能指向基类的受保护成员。它有权访问该成员。它可以调用类似范围的函数。为什么它不能做一个成员指针?我正在使用 gcc 4.1.2 并收到此错误:

0 投票
1 回答
114 浏览

c++ - 为什么不允许将 Derived T::* 转换为 Base T::*?

背景:许多函数式语言支持代数数据类型,在一定程度上可以用虚函数和继承来模拟。

最明显的解决方案涉及堆分配,因为派生类型具有不同的大小。但是,我们应该能够使用联合来保存堆栈上最大的类型,而无需任何额外分配。这需要一个额外的指向基址的指针与联合一起存储,同时使复制和赋值复杂化。

通过将成员选择器存储为从指向活动联合成员的联合开始的偏移量来解决后一个问题是令人信服的。C++ 的成员指针似乎几乎适合此目的,除了指向每个成员的指针将具有不同的类型。

问题:为什么不允许将 Derived T::* 转换为 Base T::*?

这是一个与上述无关的玩具示例,它遇到了相同的限制:

生成的编译错误:

0 投票
1 回答
66 浏览

c++ - 将指针类参数复制到类成员的好处?

我有一个播放器类,它使用我的 DirectX 图形类来创建表面和绘制精灵。

我将图形类作为指向播放器类方法的指针传递,如下所示:

在播放器类中,我的 Init 方法将指针传递给另一个指针方法。在播放器类中创建另一个图形指针并复制指针参数有什么好处吗?

所以这:

与这个:

我知道拥有一个 m_pGraphics 指针可以让我在同一个类中再次重用指针,例如我的绘图方法,但我无论如何都在播放器类中调用该方法,所以我不能一遍又一遍地传递指针吗?

0 投票
1 回答
185 浏览

c++ - 指向类成员的指针作为模板参数(具有以下类的类型)

我正在尝试将内部列表定义为具有类型安全 container_of 成员函数的模板类。为此,模板必须包括容器的类型和在容器中可以找到列表的偏移量(成员指针)。(参见下面的 C 示例)。

它应该是这样的:

但在 <> 中,类型 List 尚未定义,因此无法使用。我的下一次尝试是:

但是“???”应该放什么?那必须是整个<>,包括???。所以你得到一个无限的递归。

接下来我试图在类型安全上作弊:

但这给了我:


使用 C 预处理器 makros 我想要的看起来像这样:

那么这完全可以用模板来表达吗?

0 投票
1 回答
66 浏览

c++ - 通过指向类成员的指针调用函数

在以下代码中:

使bar::bar_function工作的正确语法是什么?

0 投票
1 回答
35 浏览

c++ - 将指定函数赋值给函数成员指针?

给定

我们如何将函数(hello)分配给函数成员指针?

我试过这个(主要):