【问题标题】:C++ 11 passing shared_pointer like with std::anyC++ 11 像 std::any 一样传递 shared_pointer
【发布时间】:2018-07-14 01:55:23
【问题描述】:

目前我面临以下问题。我需要派生类中的成员函数,它可以处理不同的 shared_ptr 类型并使用它进行自定义操作。基类应确保实现了这样的成员函数,但特定的 shared_ptr 类型只有在其他开发人员创建新的派生类时才知道。因此,由于 c++ 不支持虚拟模板函数,因此模板不是解决方案。

shared_ptrs 保存 protobuf 消息特定的发布者或订阅者。这是一段代码:

std::shared_ptr<Publisher<ProtobufMessageType1>> type1 = std::make_shared<ProtobufMessageType1>();
std::shared_ptr<Publisher<ProtobufMessageType2>> type2 = std::make_shared<ProtobufMessageType2>();

class derived : base
{

  void takeThePointerAndDoSpecificStuff( std::shared_ptr<PubOrSub<SpecificProtobufMessage>>) override
  {
     // check type and bind specific callback
  }
}

一种解决方案可以将 shared_ptr 转换为基类,但这是不可能的,因为 protobuf 消息基类是纯虚拟的。另一种解决方案是转换原始指针并仅传输这个指针,但我还需要方法中的 share_ptr 引用计数(由于绑定)。

所以我进一步寻找解决方案,std::any 可能是一个,但这里的问题是 c++11 没有 std::any(当然可以使用 boost,但我尽量避免这种情况)。

所以现在我不知道如何解决这个问题,但也许你有一个并且可以帮助我。

感谢您提前回答。

【问题讨论】:

  • 我认为你应该完善base应该代表的概念。如果你想出一个更清晰的规范,那么就有可能更自然地实现它,而不会遇到模板和虚函数的限制。现在规范非常模糊:“将shared_ptr 带到几个可能的模板类之一,并用它做'自定义的东西'”
  • 您是否希望此概念的实例: - 能够将 shared_ptr 用于来自这些类型之一的模板类的至少一个实例 - 能够将 shared_ptr 用于任何实例化这些(发布者或订阅者)模板类之一它到底应该做什么?

标签: c++11 templates pointers boost any


【解决方案1】:

一种解决方案可以将 shared_ptr 转换为基类,但这是不可能的,因为 protobuf 消息基类是纯虚拟的

这根本不是真的。您可以很好地共享指向抽象基的指针:

Live On Coliru

#include <memory>
#include <iostream>

struct Base {
    virtual ~Base() = default;
    virtual void foo() const = 0;
};

struct D1 : Base { virtual void foo() const override { std::cout << __PRETTY_FUNCTION__ << "\n"; } };
struct D2 : Base { virtual void foo() const override { std::cout << __PRETTY_FUNCTION__ << "\n"; } };

int main() {
    std::shared_ptr<Base> b = std::make_shared<D1>();
    std::shared_ptr<Base> c = std::make_shared<D2>();

    b->foo();
    c->foo();
}

打印

virtual void D1::foo() const
virtual void D2::foo() const

更多创意

即使您没有拥有一个共同的基地(或根本没有基地),您仍然可以使用shared_pointer。一个特别强大的习惯用法是使用shared_pointer&lt;void&gt;:

Live On Coliru

#include <memory>
#include <iostream>

struct D1 { 
    void foo() const { std::cout << __PRETTY_FUNCTION__ << "\n"; } 
    ~D1()            { std::cout << __PRETTY_FUNCTION__ << "\n"; }
};
struct D2 {
    void bar() const { std::cout << __PRETTY_FUNCTION__ << "\n"; }
    ~D2()            { std::cout << __PRETTY_FUNCTION__ << "\n"; }
};

int main() {
    std::shared_ptr<void> b = std::make_shared<D1>();
    std::shared_ptr<void> c = std::make_shared<D2>();

    std::static_pointer_cast<D1>(b)->foo();
    std::static_pointer_cast<D2>(c)->bar();
}

打印

void D1::foo() const
void D2::bar() const
D2::~D2()
D1::~D1()

见:http://www.boost.org/doc/libs/1_66_0/libs/smart_ptr/doc/html/smart_ptr.html#techniques_using_shared_ptr_void_to_hold_an_arbitrary_object

【讨论】:

猜你喜欢
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 2019-10-11
  • 2016-08-08
  • 1970-01-01
  • 2021-11-27
相关资源
最近更新 更多