问题标签 [pointer-to-member]

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 回答
315 浏览

c++ - 指向成员函数解析

这是一个用于过滤对象列表的函子。它必须用指向对象类的成员函数的指针来实例化,作为访问不同元素的一种方式。

并且 g++ 返回这些错误:

Filter.h:在成员函数'int Filter_Compare::eval(File&, File&) const'中:Filter.h:48:27:错误:必须使用'。' 或 '-> ' 在 '((const Filter_Compare*)this)->Filter_Compare::fun (...)' 中调用指向成员函数的指针,例如 '(... ->* ((const Filter_Compare *)this)->Filter_Compare::fun) (...)' Filter.h:48:53: error: must use '. ' 或 '-> ' 在 '((const Filter_Compare*)this)->Filter_Compare::fun (...)' 中调用指向成员函数的指针,例如 '(... ->* ((const Filter_Compare *)this)->Filter_Compare::fun) (...)'</p>

我在这里看不到问题,因为我已经在另一个类上使用了它而没有任何错误(好吧,至少它可以编译,我现在无法运行它),代码在哪里:

lit_type eval(File& f) const { return f.*(this->fun()) - thValue; }

这里到底有什么问题?我不知道如何以另一种方式引用指针。谢谢 !

0 投票
3 回答
643 浏览

c++ - (c++) 有什么方法可以优化这个循环?不能在类中使用函数指针

试图优化fun_a1()功能。变量j在范围内不变fun_a1()。因此,为每个“i”迭代检查 j==1 或 2 或 3 显然是对 CPU 周期的浪费。但是如果我试图将条件评估带到循环之外,我必须为每个条件编写冗余循环。在 C 语言中,我可以通过使用函数指针轻松解决这个问题。但是,C++ 不允许指向非静态函数的指针。我发现了一些描述神秘的“指向成员”的链接。(示例 1示例 2)但是仍然不清楚如何从对象本身内部使用它,例如从 fun_a() 内部?还是可以通过其他方式进行优化?

0 投票
4 回答
7995 浏览

c++ - 指向类成员的指针作为模板参数

我想使用指向类成员的指针作为模板参数,如下所示:

使用这个结构就好MyStruct<SomeClass, SomeResult, &SomeClass::value> variable了,但我不喜欢我必须指定SomeClassand SomeResult

如果可能的话,我想使用MyStruct<&SomeClass::value> variable它,但不会失去传递任何类并具有任何结果类型的能力。

我尝试了以下方法,但语法是非法的:

错误:模板参数列表过多

我尝试使用辅助函数(实际上在 Clang 中有效,但被 GCC 拒绝):

错误:在函数体外部使用参数“成员”
错误:模板参数 3 无效

是否有可能有一个简单MyStruct<&SomeClass::value>的,如果是这样,如何?

没有解决我的问题的相关问题:

0 投票
3 回答
1501 浏览

c++ - 将指向数据成员的指针转换为 void *

我知道我可以获得指向类或结构的数据成员的指针,但以下代码的最后一行无法编译:

为什么我不能将ptt1 转换为another_ptr?我们在谈论指针,所以一个指针应该与另一个指针具有相似的维度(尽管在概念上不同)?

0 投票
1 回答
345 浏览

c++ - 没有 typedef 的结构 - 不能在指向成员的指针中使用

我有一个简单的结构,我想要一个指向成员 c 的指针。我正在使用 MSVC2012,如果我不将 struct abc 声明为类型定义(typedef),我就不能使用它.. 怎么会?

0 投票
2 回答
8616 浏览

c++ - 对象的成员函数存储在哪里?

我正在尝试使用 C++ 来了解类/结构及其各自的对象如何在内存中布局,并且我了解类/结构的每个字段都是它们各自对象的偏移量(因此我可以拥有一个成员变量指针)。

我不明白为什么,即使我可以拥有成员函数指针,以下代码也不起作用:

我的问题是:为什么这条线

编译并返回我从结构和行开始的“c”字段的偏移量

甚至不编译?

0 投票
1 回答
152 浏览

c++ - 指向成员的指针和使用虚函数

我想用指针填充一个 constexpr 表,以便稍后调用这些指针。给定的示例仅显示一个条目。

我遇到两个问题:

1)我不可能找到正确的语法来编写能够初始化为派生类对象的成员类对象的指针。

2)我不能使用指针来调用虚函数。

0 投票
1 回答
136 浏览

c++ - Class containing template dependent on the class member

The goal is to make kind of "smart getter" that gets the value from the current object if it is present, if not, it looks for the value in the parent object.

So this ValueGetter class contains pointer to the object it is contained in (gets it as run time parameter in constructor) and pointer to member it operates on as template parameter.

This is the most simple example:

When I move the x outside of the scope of the class, it compiles. Generally it is possible for class to contain template dependent on the class type, so why this doesn't work? Is there any other way to solve this issue without storing the pointer to member in runtime in constructor? (So the structure would contain extra pointer for every value)

Edit: I just succesfully compiled it in GCC, but not in MSVC (2012), so is this MSVC compiler error?

0 投票
1 回答
113 浏览

c++ - 指向成员成员的指针还是替代方案?

假设我有一个模板函数,它通过指向成员的指针在结构中设置数据:

现在对于像这样的普通成员fa我可以在以下任意实例上使用此函数struct A

但是,有没有办法在不为每个复合成员( 、 等)编写新的、有效相同的函数的情况下访问成员或A::sA::s2类似方式访问成员?据我所知,指向成员成员的指针不存在,但是否有替代解决方案?(它必须在or的任意实例上工作,类似于上面的指向成员的解决方案的工作方式,并且不应该在or中需要额外的方法)。ss2structclassAS

为了稍微澄清这个问题(另请参阅此答案中的评论):在实际代码(配置文件阅读器)中,调用者使用第一个字符串在地图中进行查找,实际上并不知道当前正在读取什么(使用第二个字符串),因为指向成员的参数是绑定的。此外,映射被初始化一次并用于 的多个实例A,因此是指向成员的指针。

请注意 c++03 标签。因此,c++11 lambdas 不是一个选项。

0 投票
3 回答
2085 浏览

c++ - 关于 shared_ptr 和指向成员运算符 `->*` 和 `std::bind` 的指针

最近我发现shared_ptr没有指向成员运算符的指针->*。我创建了一个简单的例子:

Q1:为什么会这样?为什么 shared_ptr 没有这个操作符?

我添加了这样的运算符,shared_ptr示例开始工作:

Q2:这个运营商的实施是否正确?是否有任何“黄金”规则如何实施这样的运营商,可能我重新发明了轮子或完全错误的方向,你怎么看?有没有办法让一个函数实现这个运算符,而不是像标准中的占位符一样多的函数......

之后,我得出结论,std::bind可以在我的invoke方法中使用。

这样,我的示例也无需添加operator ->*shared_ptr.

Q3:那么,std::bind现在被认为是替代品operator->*吗?