我最近发现C++中存在.*
运算符(以及密切相关的->*
运算符)。 (请参阅this问题。)
起初看起来很整洁,但是为什么我会需要这样的东西?链接问题中的两个答案提供了人为设计的示例,这些示例将从直接函数调用中受益。
如果直接函数调用不方便,则可以使用函数对象代替,例如std::sort
中可以使用的lambda函数。这消除了间接级别,因此比使用.*
更具性能。
链接的问题还提到了此示例的简化版本:
struct A {
int a;
int b;
};
void set_member(A& obj, int A::* ptr, int val){
obj.*ptr = val;
}
int main()
{
A obj;
set_member(obj, &A::b, 5);
set_member(obj, &A::a, 7);
// Both members of obj are now assigned
}
但这是很琐碎的(也许是更好的做法,因为它更干净并且不必局限于
A
的成员)来执行此操作:struct A {
int a;
int b;
};
void set_me(int& out, int val){
out = val;
}
int main()
{
A obj;
set_me(obj.b, 5);
set_me(obj.a, 7);
// Both members of obj are now assigned
}
总之,指向成员函数的指针可以用函数对象代替,而指向成员变量的指针可以用所述变量或函数对象的直接引用代替。这样做还可以减少间接访问次数,从而提高代码的效率。
This问题仅提供了我的结论所在的示例,因此不能回答我的问题。
除了连接使用
.*
的遗留代码(根本没有选择)之外,我何时真正要使用.*
? 最佳答案
您的示例太琐碎,无法说明。考虑一个更复杂的
struct A {
int a;
int b;
};
void set_n_members(A objs[], unsigned n, int A::* ptr, int val)
{
for (unsigned i = 0; i < n; ++i)
objs[i].*ptr = val;
}
int main()
{
A objs[100];
set_n_members(objs, 100, &A::b, 5);
set_n_members(objs, 100, &A::a, 7);
}
在没有
int A::* ptr
且不引起代码膨胀的情况下,您将如何重写它?关于c++ - 我为什么要在C++中使用。*运算符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44793252/