如何在 unique_ptr 上调用函数调用运算符?

3
如果一个类有一个函数调用运算符,该运算符返回对容器的引用(已经过大量删节):
class client_connection { 
public:
    concurrent_queue<T>& operator()() { return client; }
    concurrent_queue<T> client;
};

还有另一个类,其中包含一个client_connection成员:

class remote {
public:
    void get_version() {
        auto d = ... something to generate data ...
        client().push(d.begin(), d.end());
    }
...
client_connection client;
};

如果使用client作为remote对象的一部分构建,则此方法可行。但是,如果您通过unique_ptr将所有权传递给remote,那么如何调用函数调用运算符?
将调用更改为client()->push(d.begin(), d.end());后,生成的错误消息表明问题是因为推送在unique_ptr上而不是client_connection上。
现在,在底层对象上使用.get()可以工作,但没有函数调用运算符:client.get()->push(m.begin(), m.end()); // error: ‘class client_connection’ has no member named ‘push’
然而,尝试各种组合来调用函数调用运算符都失败了。如何在包含在unique_ptr中的对象上调用函数调用运算符?

1
请提供一个 [mcve]。 - Barry
2
通常情况下,您必须使用unique_ptr->operator()(args...)。 - OutOfBound
@Barry 当我询问如何调用某个东西时,我该如何提供完整的示例呢?而且,不相关类的屏幕截图会导致读者试图找出问题所在。 - graham.reeds
@graham.reeds 很容易吧?只需要提供一个不起作用的最小示例即可。显然,不要包括“不相关类的屏幕”... - Barry
2
我一直希望在这种情况下能够使用 client->()。然而,这样的语法是无效的。 - John
1个回答

9
你可以这样做:

像这样

client->operator()().push(m.begin(), m.end());

您需要实际调用操作符,因为您有一个指针。或者,可以解引用唯一指针:

(*client)().push(m.begin(), m.end());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接