当前位置: 首页 > 知识库问答 >
问题:

我可以在不知道类型参数的情况下持有shared_ptr吗?[副本]

解明辉
2023-03-14

我想持有模板类的shared_ptr。但是,我不想将类B也作为模板类。在我的理解中,任何类型的shared_ptr都将具有相同的内存布局。所以我想知道在这种情况下有什么变通办法吗?

template<T>
class A {
...
};

class B {
...
  std::shared_ptr<A<T>> ptr;
}

共有1个答案

伊飞光
2023-03-14

当类型完全无关紧要时,可以使用void

template <typename>
class C {};

std::shared_ptr<void> p = std::make_shared<C<int>>();

添加单态基类允许限制可以存储的类型。

class AnyC {};

template <typename>
class C : public AnyC {};

std::shared_ptr<AnyC> p = std::make_shared<C<int>>();

如果该基类具有虚拟方法,则可以通过指针调用它们。

class AnyC {
    virtual void f();
};

template <typename>
class C : public AnyC {
    void f() override;
};

std::shared_ptr<AnyC> p = std::make_shared<C<int>>();
p->f();
 类似资料:
  • 问题内容: 我正在尝试使用Mockito测试一些旧代码。 我想存根用于生产的a如下: 我可以写: 但是明显的问题是,从来没有使用与我存根方法相同的对象来调用它。(请该运算符!) 如果我可以以不考虑参数的方式返回该方法的方法来对它进行存根,我将非常喜欢。失败的话,我会听取其他解决方法的建议,但我真的想避免更改生产代码,直到有合理的测试范围为止。 问题答案: 或(避免s): 不要忘记导入匹配器(有许多

  • 问题内容: 我正在使用gob将结构序列化到磁盘。有问题的结构包含一个接口字段,因此具体类型需要使用进行注册。 这里的难题是,进行灌装的图书馆应忽略所使用的混凝土类型。我希望即使调用者定义了自己的接口实现,也可以进行序列化。 我可以通过动态注册类型来成功编码数据(请参见下面的简单示例),但是在尝试重新读取数据时,gob拒绝接受未注册的类型。它令人沮丧,因为感觉好像所有数据都在那里- 如果gob 标记

  • 问题内容: 是否可以在不实现Comparable类的情况下使用Comparator?例如,如果我有以下内容: 然后可以使用comp比较两个对象吗?如果是这样,我将如何去做? 谢谢… 问题答案: 你不用。您使用。 是由对象实现的接口,用于指定它们与相同类型的其他对象的排序顺序。 是一个通用接口,只需要两个对象并告诉您它们的排序顺序。因此,您可以执行以下操作: 与: 和:

  • 假设我想构建一个API,用于(1)提交要执行的作业,以及(2)稍后获取它们的结果/状态。 现在,提交endpoint接收一个有效负载和一些头。有效负载通过一个定制的JpaRepository持久化,头部被推送到JobParameters的一个实例中(然后被馈送到JobLauncher)。据我目前所知,有一个JobRepository最终将持久化我的JobParameters。 A.关于这个设计,我

  • 问题内容: 我试图解析Java中的JSON字符串并找到键值对,以便我可以确定JSON对象的近似结构,因为JSON字符串的对象结构是未知的。 例如,一个执行可能具有这样的JSON字符串: 另一个像这样: 如何遍历各种JSON元素并确定键及其值?我看着的。我知道如何获取下一个“令牌”并确定令牌的类型(即字段名称,值,数组开头等),但是,我不知道如何获取实际令牌的值。 例如: 或其他库(或)中是否有一个

  • 问题内容: 有什么方法可以在不直接使用Spring Context的情况下加载带有标记的类?基本上,我想重用Spring所做的所有智能逻辑,但是对于在bean生命周期之外手动实例化的bean。 我有一个可以在Spring(引导)中愉快地加载的bean,可以将其注入到其他Service bean中: 详情参见春天docco http://docs.spring.io/spring-boot/docs