我怎样才能保持'first'和'second'用结构替换 std::p air?
How can I keep 'first' and 'second' replacing std::pair with struct?
我有一对std::pair<int, long>
,在不同地方的代码中使用pr.first
,pr.second
(也ppr->first
,ppr->second
)类型的符号。 现在我想将这对更改为结构体,
struct ABC
{
int a;
long b;
};
有没有办法在代码中保留这些"第一"和"第二"符号来访问此结构?也许创建一个函数?
撇开您想要这样做的原因(在没有任何其他信息的情况下至少可以说是有问题的),最简单的方法是使用
struct ABC
{
int first;
long second;
};
但是,如果您希望调用其他成员,并且不想诉诸"getter"函数(这需要在调用站点使用括号),则解决方案是对成员变量使用引用:
struct ABC {
int a;
long b;
int& first;
long& second;
ABC() : first(a), second(b) {}
};
但是,如果您采用此方法,则需要自己编写属于"5 法则"一部分的构造函数以正确绑定引用,否则看似无趣的副本或移动将不起作用。
虽然这个答案展示了C++的力量,但这种语言以其允许你搬起石头砸自己的脚的能力而闻名。尽管解决方案很花哨,但随着代码库甚至语言本身的发展,引入奇怪错误的可能性怎么强调都不为过。因此,这应该被认为是一种反模式,并且只在真正特殊的情况下使用。
你可能想试试这个:
struct ABC
{
union {
int a;
int first;
};
union {
long b;
long second;
};
};
这允许您使用a
和first
以及可互换b
和second
。 不过,最好替换first
和second
用法以避免混淆。
正如所指出的,这是未定义的行为12.3 Unions
但至少适用于MSVC和GCC。 感谢评论
相关文章:
- std::vector的包装器,使数组的结构看起来像结构的数组
- C++匿名结构作为std::映射值
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- 使用 std::optional,而不是自己的结构
- 包含 std::list 的结构体的 C++ 初始化
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- std::transform 将一个结构数组复制到另一个结构数组
- 是否可以使用 std::array 作为 POD 结构的数据容器?
- 像 std::list<std::p air<string, string>> 这样的结构在返回时会被复制吗?
- C++ std::vector<int> 体系结构的未定义符号 x86_64:
- 将结构 std::memcpy 转换为具有足够容量的 std::vector 是未定义的行为<char>吗?
- 当我尝试访问结构类型时,我收到 std::bad_variant_access 异常
- 当使用 std::CIN 输入结构时,它会出错
- CLang:在 std::thread 中运行函数会导致结构创建BAD_ACCESS
- 在std::线程中使用已分配的结构数据
- 带有 std::minmax 和 rvalues 的结构化绑定
- 哪些C结构出现在std命名空间中
- 向量的向量作为有效的数据结构;std::vector<std::vector>的替代品<someType>
- 结构 std::iterator_traits<...中没有名为"指针"的类型>