- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一些包装 std::unordered_map 类型的 C++ 代码,我想在其中隐藏底层类型并将其呈现为另一种类型。更具体地说,我想用另一种类型包装 std::unordered_map 中的 std::pair。为了便于讨论,让我们假设包装器看起来像这样......
template <typename ActualT >
class wrapper final
{
private:
ActualT actual_;
public:
//Some constructors...
typename ActualT::first_type & get_first()
{
return actual_.first;
}
typename ActualT::second_type & get_second()
{
return actual_.second;
}
};
我的理由是,由于包装类只有一个成员,它是它所包装的确切类型,将引用从原始类型转换为包装类型应该没问题,但结构的类型兼容性表明成员应该具有相同的类型和名称以使类型兼容。以这种方式使用类型双关是否会导致未定义的行为或对齐问题?
using my_map = std::unordered_map < int, int >;
my_map m;
//Do some inserts...
reinterpret_cast<wrapper<typename my_map::value_type>&>(*m.find(10)).get_second() = 1.0;
我希望允许客户端代码在不知道 map 返回的对的情况下访问 map 的条目。我还想编写一个自定义的前向迭代器,因此我需要返回对条目的引用。将对这对的引用转换为对充当包装器的类的引用会被认为是危险的吗?
是否有更好的方法来实现这一目标?
最佳答案
这绝对是未定义的行为。
认真重新考虑您的优先事项。
窗体的一些自由函数
const my_map::key_type & MeaningfulNameHere(my_map::reference)
会给你有意义的名字大有帮助。
如果您必须用不同的名称包装标准库,只需使用非显式构造函数并存储引用即可。
template <typename Map>
class entry final
{
private:
typename Map::reference ref;
public:
entry(Map::reference ref) : ref(ref) {}
const typename Map::key_type & key()
{
return ref.first;
}
typename Map::mapped_type & value()
{
return ref.second;
}
};
如果您确实需要迭代器取消对entry
的引用,您可以。但是您可以从 Map::iterator::operator*
返回的 Map::reference
隐式实例化 entry
,您不需要不需要自定义迭代器。
template <typename Map>
class entry_iterator
{
private:
typename Map::iterator it;
entry<Map> entry;
public:
entry<Map>& operator*() { return entry; }
entry_iterator operator++() { ++it; entry = *it; return *this; }
// etc
}
关于C++ 类双关语类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51177138/
我想我已经找到了一种在 C# 中复制位图的更快的方法。 (如果它是有效的,我确定我不是第一个,但我还没有在任何地方看到它。) 我能想到的最简单的提问方式是断言我的想法是基于什么,如果没有人指出其中的漏
我正在为 PIC32MX 编写 C,使用 Microchip 的 PIC32 C 编译器(基于 GCC 3.4)编译。 已添加 我遵循的标准是 GNU99(C99 带有 GNU 扩展,编译器标志 -s
在开源中 program Iwrote ,我正在从文件中读取二进制数据(由另一个程序编写)并输出整数, double ,和其他各种数据类型。挑战之一是它需要在两种字节顺序的 32 位和 64 位机器上
这是我为学习 js 而编写的图片库中的一些清理代码。我将画廊创建为一个对象,但在某些时候我忘记了“this”指向的内容。底部发生的事情对我来说没有意义(看看评论)。有人可以解释一下吗? functio
我是一名优秀的程序员,十分优秀!