问题标签 [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.
c++ - 如何按类型(不是值)添加使用指向成员值的指针作为模板参数
我的情况:
我经常需要一个结构向量,其中一个字段可以被认为是一个键或 ID,而不是将它昂贵地存储在地图中(内存使用在这个应用程序中非常重要)我想将它存储在一个平面向量中但提供了一个类似地图的界面,用于按键查找元素。
我对这个问题的第一个解决方案:
现在这一切都有效,但我希望能够KeyExtractor
通过使用指向嵌入类型的成员变量的指针来消除对类型的需求:
但是我无法让它工作。我一直在寻找std::mem_fn
线索的实现,但我不知道该怎么做。我得到的错误是这样的:
有什么线索吗?
编辑: http: //ideone.com/Qu6TEy上的示例版本
c++ - 将指向乘法类的指针传递给成员函数
我有下一节课:
试图编译它我得到一个错误:
文件:integration.h,第 18 行,语法错误:'<tag>::*'
如何调用可能属于任何类的回调?
第二个问题:当我尝试在没有明确模板规范的情况下调用它时
我收到一个错误
文件:main.cpp,第 65 行,“MyIntegrator::integrate”:找不到匹配的重载函数
那么,为什么这个函数不能从它的参数中推断出它的参数呢?
在没有依赖默认参数的最后一个参数的情况下调用它时,我也会遇到同样的错误。
c++ - 为什么不能将范围解析与成员指针取消引用一起使用?
考虑一个简单的例子:
如您所见,foo
在调用 bar 成员函数时可以在对象上使用范围解析,而无法显式声明成员函数指针的范围。我接受在使用时应该禁止语法,->*
因为有时可能会以意想不到的方式重载运算符,但我无法理解在取消引用时阻止显式范围解析的原因.*
。
我正在尝试为指向基类的虚函数的成员指针禁用虚拟调度。
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);
,那将有助于我理解它的用途。
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 :
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::foo
derived
base<derived>
derived
编辑:我在技术上提出了一个可行的解决方案。基本上,base
派生自super<base<impl_t>>
而不是super<impl_t>
,所以现在我们可以调用foo
的成员base<impl_t>
,如果我们需要与最派生类不同的行为,我们可以将基类中的方法设为虚拟。但这抛弃了 CRTP 的一些好处(我们现在在对象中有 VTBL,以及动态多态的成本,即使我们在编译时知道我们想要什么)。
谢谢
c++ - C ++:是否可以将方法分配给同一类中的函数指针成员(属性)?
这就是我想要做的:我有一个带有成员(属性)的类,它是一个函数指针。在创建者中,我想将同一类的一些方法分配给该指针(取决于某些条件),然后在其他方法中使用它。例如:
当我在 CodeBlocks 中编译此代码时,我收到此错误:
c++ - 为什么声明顺序对于将成员函数指针作为模板参数传递很重要?
看看这段代码:
它成功地用g++ -std=c++14 -Wall -Wextra
.
foo
但是,当我更改and的顺序时type_t
,会发生错误:
通常,类定义中的声明顺序对名称解析没有影响。例如:
但是,它在这种情况下会产生影响。为什么?
c++ - 是否打印指向 int 的成员指针已定义
假设我有这个代码:
当我使用 Microsoft Visual C++ (2015) 运行它时
我得到以下输出
我期望的输出更像是这样的:
所以这就引出了一个问题:这个成员指针的打印是否定义了行为?
c++ - 通过成员指针访问受保护的成员:是黑客攻击吗?
我们都知道protected
从基类指定的成员只能从派生类自己的实例中访问。这是标准中的一个特性,这已经在 Stack Overflow 上多次讨论过:
但似乎可以用成员指针绕过这个限制,正如用户 chtz向我展示的那样:
为什么这是可能的,它是一个想要的特性还是实现或标准的措辞中的某个小故障?
从评论中出现了另一个问题:如果Derived::f
用实际调用Base
,它是未定义的行为吗?