在 C++ 中访问类型成员

2023-12-02

给定一个容器,例如vector<int>

#include <vector>
using namespace std;
vector<int> v{1, 2, 3};

为什么访问公共类型成员(例如iterator and const_iterator?据我了解,这些名称是类(而不是对象)的一部分,必须通过::指定范围,但有理由禁止吗v.const_iterator when v是已知的吗? 例子:

int f(v.iterator it) {
    return *it;
}
// or
int g(v::iterator it) {
    return *it;
}

解决方法是使用decltype as in:

int h(decltype(v)::iterator it) {
    return *it;
}

但这种方法甚至在课堂上不起作用,因为以下失败:

class A
{
public:
    int h(decltype(x)::iterator it) {
        return *it;
    }
private:
    vector<int> x;
};

Edit

只是一点旁注。 正如所指出的,其含义是v.iterator取决于类型v在使用时(编译时)忽略运行时多态性。但静态类成员也是如此。 例子:

struct A
{
    static const int x = 1;
};
struct B : public A
{
    static const int x = 2;
};
void eval()
{
    B b;
    A& ar = b;
    b.x; // 2
    ar.x; // 1, even though ar refers to the same underlying object (by the base type)
}

正如@Slava 在评论中指出的那样,decltype(x)是这样做的方法:

#include <vector>
using namespace std;
vector<int> v{1, 2, 3};
int f(decltype(v)::iterator it) {
    return *it;
}

int g(decltype(v)::iterator it) {
    return *it;
}

class A
{
private:
    vector<int> x;
public:
    int h(decltype(x)::iterator it) {
        return *it;
    }
};

会员访问.运算符和范围解析运算符::不得超载。正如你可以从名字中推断出的那样,.习惯于访问成员, while ::用于访问scope.

#include <iostream>

struct B {
    class iterator { };

    // no need for typename, compiler knows that we mean typedef B::iterator, as he can only find it
    iterator iterator1;

    // member named the same as class, ops!
    int iterator;

    // we need to use typename here, B::iterator is resolved as member
    // iterator iteartor3;
    typename B::iterator iterator2;
};

int main() {
    B bobj;

    // we access the member iterator inside b
    bobj.iterator = 1;

    // we declare object of B::iterator type
    // we need to tell compiler that we want only types
    typename B::iterator iterator;

    // this will work too
    typename decltype(bobj)::iterator iterator2;

    // we declare a member pointer to the iterator member inside some B class
    // no typename, as I want pointer to member, not pointer to... type
    int B::* pointer = &B::iterator;

    // this is just a pointer to the iterator specifically in bobj class
    int * pointer2 = &bobj.iterator;

    // foo(bar) 
    bobj.*pointer = 1;

    // this will work as expected
    int decltype(bobj)::* pointer3 = &B::iterator;
}

另外,C++ 中没有“类型成员”(至少我在 C++ 标准中找不到它们)。在类中声明为成员的类和枚举以及 typedef 声明称为“嵌套类型”或“嵌套类”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 中访问类型成员 的相关文章

  • 以编程方式在网格视图列上显示数据

    我有一个产品数量列表和一个网格视图 网格视图已经绑定到一些数据 但我想在网格视图的第三列显示产品数量列表 以下是如何将数据绑定到网格视图的代码 gvProduct DataSource distSPUItem gvProduct DataB
  • 你好世界,裸机 Beagleboard

    我正在尝试在我的 Beagleboard xm rev 上运行 hello world 类型的程序 C 通过调用 Cputs功能来自装配 到目前为止 我一直使用这个作为参考 http wiki osdev org ARM Beagleboa
  • NHibernate手动控制抓取

    我正在使用 NHibernate 我想控制手动获取相关实体 这是我的示例实体 public class Post public virtual long Id get set public virtual string Title get
  • 任务计划程序控制台输出在哪里? (C# 控制台应用程序)

    我正在运行 C Windows 控制台应用程序 并通过任务计划程序传递几个参数 它全天运行 将其他应用程序创建的平面文件数据加载到 SQL Server 中 该程序间歇性失败 并且我有 Try Catch 逻辑 该逻辑使用 Console
  • 如何在 C++ 中的嵌套词法作用域可访问的作用域中声明静态信息?

    我想声明范围的标识符 该标识符将用于自动填充最内部范围内任何日志记录语句的字段 它们通常会 但并非总是如此 例如 lambda 使用 引入的块 匹配封闭块的 名称 用法看起来像这样 namespace app LOG CONTEXT app
  • 管理多个解决方案中存在的 C# 项目的 Nuget 包

    我现在正处于这样的阶段重构疯狂一个有很多的大项目遗留和不稳定的模块 我决定拆分解决方案目前 所有项目 大约有 20 个 而且由于下个月肯定会出现单元测试项目 还会有更多 链接在一起 使其更加独立和细化 通过这种方法 有一些模块 例如需要在多
  • 有了private修饰符,为什么可以直接访问其他对象中的成员呢?

    我有以下代码 class A private int x public A x 90 A A a1 A a2 a1 x 10 a2 x 20 int getX return this gt x 我知道代码可能很奇怪 但我不明白为什么a1 a
  • ctypes.ArgumentError:不知道如何转换参数

    我在C库中定义了一个函数 如下所示 int Test char str1 int id1 char str2 float val float ls 我想在Python中使用它 所以我编写了以下Python代码 str1 a str2 b i
  • 本机 C++ 通过代理 C++ 托管 dll 使用 C# dll

    这相当复杂 所以请耐心听我说 我有一个用本机 仅限 Win32 C 编码的第 3 方程序 目标 作为目标设计的一部分 它实现了一个 dll 插件系统 本机 DLL 当放置在程序的 ext 目录中时 由目标加载 然后 目标根据需要调用每个 D
  • 类型定义存在于两个库中

    我正在使用 NET 4 5 构建 ASP NET Web 窗体网站 错误 The type System ComponentModel DataAnnotations Schema ForeignKeyAttribute exists in
  • DLR 返回类型

    我需要 DLR 的帮助 我正在实现 IDynamicMetaObjectProvider 和 DynamicMetaObject 但在获取预期返回类型时遇到一些问题 我在元对象中覆盖 BindInvokeMember 我可以看到所有参数类型
  • 在 C# 中给定周数和年份,计算一周的开始和结束日期(基于 ISO 规范)

    我需要生成一份报告 显示一年中的 52 周 或某些年份的 53 周 及其开始日期和结束日期 有一个 ISO 规范可以做到这一点 但看起来非常复杂 我希望有人知道在 C 或 Visual Basic 中执行此操作的方法 实际上适用于 Visu
  • 需要帮助将 winform 迁移到 net 5

    我正在将 winform 应用程序从 net core 3 1 移植到 net 5 并收到以下错误 严重性代码 说明 项目文件行抑制状态 错误NETSDK1136 目标平台必须设置为Windows 通常 通过在 TargetFramewor
  • 将控制台输入和输出重定向到文本框

    您好 提前致谢 我正在尝试 非常努力 将控制台输入和输出重定向到文本框 到目前为止 输出工作正常 但问题在于输入 例如 我无法执行一个简单的程序来执行以下操作 Console WriteLine 请输入您的姓名 字符串名称 Console
  • 给出对象的指针作为参数

    假设我有 void func foo obj 我有 foo object 我该如何制作object进入争论func 只需取消引用它即可 func object
  • 在浏览器中测试wcf服务

    我无法在浏览器中调用基本的 wcf web 方法 即使使用
  • 如何从 MongoDB 中的 ChangeStream 过滤对特定字段的更新

    我正在设置一个 ChangeStream 以便在集合中的文档发生更改时通知我 以便我可以将该文档的 LastModified 元素更新插入到事件发生的时间 由于此更新将导致 ChangeStream 上发生新事件 因此我需要过滤掉这些更新以
  • BlueZ D-Bus C,应用 BLE

    我正在尝试编写一个应用程序来搜索附近的蓝牙设备并与它们通信 我的应用程序将用 C 语言编写 并打算在 Linux 下工作 是否有通过 C 中的 D Bus 使用 BlueZ 的教程或示例 此应用程序的目的是从 BLE 中的文件发送数据 你能
  • wpf中的图像问题(图像不显示)

    我不明白为什么我无法在 WPF 中显示图像 也许我不小心修改了我的资源文件夹 这就是我没有显示的原因 所以我创建了一个新的 wpf 应用程序 我有这个 当我运行该程序时 我的图片显示为 为什么当我尝试在程序中执行相同的操作时 图像没有显示
  • 文件按文件名模式存在

    我在用 File Exists filepath 我想做的是将其替换为模式 因为文件名的第一部分发生了变化 例如 该文件可以是 01 peach xml 02 peach xml 03 peach xml 如何根据某种搜索模式检查文件是否存

随机推荐

  • C++ - 传递对 std::shared_ptr 或 boost::shared_ptr 的引用

    如果我有一个需要与shared ptr 将其传递给它的引用不是更有效吗 这样可以避免复制shared ptr目的 可能有哪些不良副作用 我设想两种可能的情况 1 在函数内部 由参数组成一个副本 如 ClassA take copy of s
  • 获取p标签的行高[重复]

    这个问题在这里已经有答案了 我想计算出一个的行高 p div 内的标签 var myp document getElementById myp var heightLabel document getElementById heightLa
  • 在 TextMate 问题中用反向引用替换

    我正在使用 TextMate 来替换表达式 my expression 由开括号和闭括号之间的字符组成 my expression 所以我尝试更换 by 1 正则表达式匹配正确的表达式 但替换给出 1 因此该变量不被识别 有人可以有想法吗
  • Google Chart:如何更改负值的颜色

    我目前有一个使用 GoogleCharts 的漂亮的 AreaChart 但是我试图在值为负时更改图表的颜色和背景颜色 根据我的发现 想法是仅显示一个区域用于正值 而另一个区域用于显示负值 以便我可以自定义颜色 然而你可以在下面看到我并没有
  • 当状态是对象数组时更新 React 状态

    我有一个处于状态的对象数组 this state items id 1 someattr a string anotherattr id 2 someattr another string anotherattr id 3 someattr
  • Android ViewPager 方向更改

    我读过 安东尼特的回答这个StackOverflow问题 that FragmentPagerAdapter将尝试重用通过以下方式找到的现有片段FragmentManager findFragmentByTag 方向改变后 我已经尝试过了
  • 具有固定行数和列数的集合视图

    我有一个集合视图 并且希望在多个设备上保持一致的行数和列数 在 iPhone 6s Plus 上 显示 6 个项目 但在 iPhone 5s 上查看应用程序时 仅显示 4 个项目 See my layout here 如何使集合视图在不同设
  • 为什么我会看到 VSCode 中的 let 语句中添加了“: String”?

    当我在 VSCode 中输入以下内容时 let mut guess String new 我看到它变成了 let mut guess String String new 为什么会发生这种情况 这些被称为镶嵌提示 rust analyzer
  • 稍后交付无法在 Rails 5 的测试环境中运行

    基本上 测试配置的设置与 Rails 4 中的工作方式完全相同 传递方法设置为测试等 除了我已替换的已弃用的选项之外 邮件仅使用 Deliver now 发送 而不是 Deliver later Deliver later 在开发环境中工作
  • 嵌入 UIHostingController 中的 NavigationView 具有额外的安全区域插图

    有人知道如何处理这个问题吗 似乎当您有一个带有 NavigationView 的 UIHostingController 时 会发生以下情况 注意大的灰色标签栏安全区域 这主要是一个 UIKit 应用程序 我们正在用 swiftUI 视图替
  • 大于行首的符号

    我刚刚在脚本中看到以下内容 但不确定它的含义 started STATUSDIR EVENT ID started errs STATUSDIR EVENT ID errors started is used to capture the
  • Python - time.sleep(n) 是 CPU 密集型的吗? [复制]

    这个问题在这里已经有答案了 我一直在考虑使用time sleep n 在 python 脚本中使其以不同的时间间隔执行作业 伪代码如下所示 total jobs next jobs to run next closest total job
  • 带输入参数的 MVC jquery ajax 调用

    当我在带有参数的控制器上调用操作时遇到问题 在控制器中我有以下操作 HttpPost public ActionResult UpdateData string month return Json new success true mess
  • org.apache.harmony.xml.ExpatParser$ParseException 的问题

    我的 SaxParser 实现有时会抛出 org apache harmony xml ExpatParser ParseException At line 1 column 0 no element found 例外 在下一次尝试中 效果
  • 执行标量之后:未设置对象引用等

    我应该添加什么代码来接受 WHERE 语句中的 null int numApprovals 0 string sql SELECT COUNT Type AS OpenforApproval FROM dbo LeaveRequest WH
  • JScrollPane 和 JPanel

    所以 我正在制作一种文本编辑器 并且我需要一个 JScrollPane 来进行垂直导航 但我无法让它发挥作用 我已经阅读了谷歌结果前十页上的所有该死的教程 但我无法让它工作 假设我有 JFrame 大小 1000x800 我想在其中放置一个
  • 在 Bash 中使用 getopts 检索单个选项的多个参数

    我需要帮助getopts 我创建了一个 Bash 脚本 运行时如下所示 foo sh i env d 目录 s 子目录 f 文件 当处理每个标志的一个参数时 它可以正常工作 但是 当我从每个标志调用多个参数时 我不确定如何从变量中提取多个变
  • Java:布尔值+整数

    有没有办法让 Java 能够处理布尔 整数加法和求值 更具体地说 C 有一个适当的功能可以缩短许多 if 语句 for int i 0 i lt n i cout lt lt i 相当于 while n cout lt lt n 或者 代替
  • 更改文件后重新启动节点

    对于有 PHP 背景的人来说 每次代码更改后杀死节点并重新启动它的过程似乎非常乏味 使用节点启动脚本时是否有任何标志可以在保存代码更改时自动重新启动节点 一个好的选择是节点主管 npm install supervisor g 迁移到应用程
  • 在 C++ 中访问类型成员

    给定一个容器 例如vector