问题标签 [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 投票
2 回答
52 浏览

c++ - 如何按类型(不是值)添加使用指向成员值的指针作为模板参数

我的情况:

我经常需要一个结构向量,其中一个字段可以被认为是一个键或 ID,而不是将它昂贵地存储在地图中(内存使用在这个应用程序中非常重要)我想将它存储在一个平面向量中但提供了一个类似地图的界面,用于按键查找元素。

我对这个问题的第一个解决方案:

现在这一切都有效,但我希望能够KeyExtractor通过使用指向嵌入类型的成员变量的指针来消除对类型的需求:

但是我无法让它工作。我一直在寻找std::mem_fn线索的实现,但我不知道该怎么做。我得到的错误是这样的:

有什么线索吗?

编辑: http: //ideone.com/Qu6TEy上的示例版本

0 投票
1 回答
100 浏览

c++ - 将指向乘法类的指针传递给成员函数

我有下一节课:

试图编译它我得到一个错误:

文件:integration.h,第 18 行,语法错误:'<tag>::*'

如何调用可能属于任何类的回调?

第二个问题:当我尝试在没有明确模板规范的情况下调用它时

我收到一个错误

文件:main.cpp,第 65 行,“MyIntegrator::integrate”:找不到匹配的重载函数

那么,为什么这个函数不能从它的参数中推断出它的参数呢?

在没有依赖默认参数的最后一个参数的情况下调用它时,我也会遇到同样的错误。

0 投票
1 回答
241 浏览

c++ - 为什么不能将范围解析与成员指针取消引用一起使用?

考虑一个简单的例子:

如您所见,foo在调用 bar 成员函数时可以在对象上使用范围解析,而无法显式声明成员函数指针的范围。我接受在使用时应该禁止语法,->*因为有时可能会以意想不到的方式重载运算符,但我无法理解在取消引用时阻止显式范围解析的原因.*

我正在尝试为指向基类的虚函数的成员指针禁用虚拟调度。

0 投票
2 回答
115 浏览

c++ - 这种类型的模板参数的含义是什么 - `ClassAT::*ELEM`?

我最近在侵入性列表的上下文中遇到了这段代码:

我在 boost侵入式列表库( member_hook<class T, class Hook, Hook T::* PtrToMember>)中看到了类似的代码。

我的问题是关于模板参数Node<T> T::*NODE。我不是 C++ 方面的专家,但我以前从未遇到过这种特殊的语法,也不知道要搜索什么来理解它。

这是什么意思?它的目的是什么,我应该将其解释为 - “ NODE 是指向节点的指针,属于 T ”?这对我来说没有意义,因为不知道 T 提前包含特定成员,据我所知,::它用于解析范围。

同样,如果有人可以澄清*NODE这一行中的用法,例如 : Node<T> *node = &(elem->*NODE);,那将有助于我理解它的用途。

0 投票
1 回答
888 浏览

c++ - auto fails to deduce?

Any ideas why this can't be deduced? I would appreciate answers referencing the Standard.

Edit :

I have found a RAD Studio language extension called __closure that appears to be addressing this issue.1 Here is the code :

http://docwiki.embarcadero.com/RADStudio/Seattle/en/Closure

0 投票
0 回答
139 浏览

c++ - 向下转换的指向成员的指针作为模板参数

我正在使用 Curiously Recurring Template Pattern 编写一些代码,其中派生类在编译时被传递以专门化其自己的基类。

有了这个,我遇到了一个烦人的问题,我为此做了一个玩具示例。我已经注释了 base::bar 并带有描述预期行为(以及为什么我期望它)的注释。整个示例旨在按原样编译,并导致 3 个编译器错误(clang-3.9),如注释中所述。供参考,$4.11/2:

“指向类型为 cv T 的 B 的成员的指针”类型的纯右值,其中 B 是类类型,可以转换为类型为“指向类型为 cv T 的 D 的成员的指针”类型的纯右值,其中 D 是派生类 ( B 的第 10 条)。如果 B 是 D 的不可访问(第 11 条)、模棱两可(10.2)或虚拟(10.1)基类,或 D 的虚拟基类的基类,则需要进行此转换的程序是格式不正确。转换的结果与发生转换之前的成员指针引用相同的成员,但它引用基类成员,就好像它是派生类的成员一样。结果引用了 D 的 B 实例中的成员。由于结果的类型为“指向类型为 cv T 的 D 成员的指针”,因此可以使用 D 对象取消引用。

对于“为什么”:现有代码仅使用实际定义的成员base实例化。如果我也可以使用在 中定义、由 继承的成员,我会很高兴。实际代码使用成员函数,但对于示例来说成员数据就足够了。super::fooderivedbase<derived>derived

编辑:我在技术上提出了一个可行的解决方案。基本上,base派生自super<base<impl_t>>而不是super<impl_t>,所以现在我们可以调用foo的成员base<impl_t>,如果我们需要与最派生类不同的行为,我们可以将基类中的方法设为虚拟。但这抛弃了 CRTP 的一些好处(我们现在在对象中有 VTBL,以及动态多态的成本,即使我们在编译时知道我们想要什么)。

谢谢

0 投票
2 回答
41 浏览

c++ - C ++:是否可以将方法分配给同一类中的函数指针成员(属性)?

这就是我想要做的:我有一个带有成员(属性)的类,它是一个函数指针。在创建者中,我想将同一类的一些方法分配给该指针(取决于某些条件),然后在其他方法中使用它。例如:

当我在 CodeBlocks 中编译此代码时,我收到此错误:

0 投票
2 回答
1200 浏览

c++ - 为什么声明顺序对于将成员函数指针作为模板参数传递很重要?

看看这段代码:

它成功地用g++ -std=c++14 -Wall -Wextra.

foo但是,当我更改and的顺序时type_t,会发生错误:

通常,类定义中的声明顺序对名称解析没有影响。例如:

但是,它在这种情况下会产生影响。为什么?

0 投票
2 回答
131 浏览

c++ - 是否打印指向 int 的成员指针已定义

假设我有这个代码:

当我使用 Microsoft Visual C++ (2015) 运行它时

我得到以下输出

我期望的输出更像是这样的:

所以这就引出了一个问题:这个成员指针的打印是否定义了行为?

0 投票
4 回答
5009 浏览

c++ - 通过成员指针访问受保护的成员:是黑客攻击吗?

我们都知道protected从基类指定的成员只能从派生类自己的实例中访问。这是标准中的一个特性,这已经在 Stack Overflow 上多次讨论过:

但似乎可以用成员指针绕过这个限制,正如用户 chtz向我展示的那样:

在 coliru 上进行现场演示

为什么这是可能的,它是一个想要的特性还是实现或标准的措辞中的某个小故障?


从评论中出现了另一个问题:如果Derived::f用实际调用Base,它是未定义的行为吗?