如果我有以下代码:
struct someStruct
{
int x;
int y;
}
class someClass
{
public:
someStruct m_member;
alias m_x = m_member.x; // I am aware alias is not a keyword and even if it was, I cannot assign it a value like this
alias m_y = m_member.y; // I am aware alias is not a keyword and even if it was, I cannot assign it a value like this
}
我可以为m_member.x
和m_member.y
提供别名,而不会产生额外的参考存储成本(与指针相同)吗?类似于typedef的东西?
答案 0 :(得分:10)
您可以编写内联访问功能:
class someClass
{
public:
someStruct m_member;
int& mx() { return m_member.x; }
int& my() { return m_member.y; }
int const& mx() const { return m_member.x; }
int const& my() const { return m_member.y; }
};
然后您可以按如下方式访问成员:
someClass foo;
foo.mx() = 3;
foo.my() = 2*foo.mx();
它不是完全相同的语法,但是接近,一个相当不错的编译器将完全优化内联函数。
答案 1 :(得分:1)
在这种情况下,我会使用一个引用,因为它是它们适合的。如果参考开销真的太多,我会放弃别名并使用完整表达式。
但是你可以用宏来实现这一点(阅读:邪恶)
class someClass
{
public:
someStruct m_member;
#define m_x m_member.x
#define m_y m_member.y
...
#undef m_x
#undef m_y
};
我强烈建议不这样做。与所有宏一样,虽然它有一些意想不到的后果(可能导致对类型中m_x
的其他有效用途的错误引用)。
例如
struct s1 {
int m_x;
};
class someClass {
public:
someStruct m_member;
#define m_x m_member.x
#define m_y m_member.y
...
void Example(S1& s1) {
s1.m_x = 42; // This wouldn't compile and you'd get terrible error messages
}
};