派生类中的成员字段别名(无访问器功能)
Member field aliases in derived class (no accessor functions)
玩具示例:
template<typename T, std::size_t N>
class static_vector
{
public:
T& operator[](std::size_t i) { return m_elements[i]; }
T const& operator[](std::size_t i) const { return m_elements[i]; }
private:
std::array<T, N> m_elements;
};
template<typename T>
class vector3
: public static_vector<T, 3>
{
public:
using vector_type = static_vector<T, 3>;
// x = vector_type::operator[](0);
// y = vector_type::operator[](1);
// z = vector_type::operator[](2);
};
让vector3<float> pos;
。我想通过pos.x
访问pos[0]
。显然,如果宣布pos
为const
,我希望pos.x
仅阅读。
这是可能的吗?
让我强调一个事实,我不想使用表单的访问器功能
T& x() { return (*this)[0]; }
T const& x() const { return (*this)[0]; }
使用您想要的确切语法没有零成本的方式。
放松成本(编译,维护,内存使用时间和运行时(或语法(您的()
是一个示例(可以带您想要的东西。
我在您的问题中添加了评论,但我想我会添加一个带有一些代码的答案以澄清。请警告,接下来是一个好主意。
您可以使用简单的指针算术来解释struct
的成员,就像它们是array
中的元素一样。因为struct
成员的类型和伪array
中的元素类型是相同的,所以我们可以安全地重新诠释一个,因为另一个 waveat struct
成员之间没有填充。
C 标准没有定义struct
中填充的方法,因此您必须依靠编译器特定指令。但是我相信MSVC和GCC都支持#pragma pack
。
#pragma pack(push, 1)
template <typename T>
struct Vec3
{
T x;
T y;
T z;
T& operator[](size_t i) { return *(&x + i); }
const T& operator[](size_t i) const { return *(&x + i); }
};
#pragma pack(pop)
那么为什么这不是一个很好的解决方案?
您依靠编译器特定指令,使您的代码降低了便携式。
您需要明确声明每个成员,这意味着您需要用于VEC2,VEC3和VEC4的单独模板。
1个字节对齐不支持所有架构,使您的代码降低了便携式。
即使在支持未对齐的内存访问(例如x86(的体系结构上,也会带有性能惩罚。
相关文章:
- 如何从其他功能C++访问参数?
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- 访问我以前可以访问的功能时出现分段错误
- 好友功能 - 成员无法访问
- 如何启用友元类的友元功能直接在C++中访问其私有成员
- 无法从好友功能访问类的私有成员?"ostream"不是"std"的成员?
- 无法访问公共功能? 没有指定成员?
- 好友功能仍无法访问私人会员
- 我无法获得好友会员功能以实际访问私人会员
- GPU设备函数如何访问主机功能中定义的对象
- 派生类中的成员字段别名(无访问器功能)
- 从C文件访问C 类成员功能
- 访问嵌套结构的数据成员并将结构传递到功能C
- 使用宏访问功能
- QT:类的访问功能,该功能使用构造函数外的GUI小部件
- 在其他源文件中没有通用的头文件访问功能
- 这是使用访问功能的好习惯
- 从C 访问功能环境中的LUA变量
- 如何在右键单击链接并从上下文菜单访问功能后获取链接的 DOM
- QObject信号和插槽未访问功能