【发布时间】: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