我最近发现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/

10-11 22:47
查看更多