【问题标题】:Differentiate between shared_ptr and normal type on compile time在编译时区分 shared_ptr 和普通类型
【发布时间】:2020-11-16 09:44:30
【问题描述】:

我尝试创建一个模板类,它将模板参数保存为成员变量 (msg_)。 现在类的输入应该允许像intshared_ptr<int>这样的普通类型。

template <typename T>
class Foo {
 public:
  Foo<T>() {};
 private:
  T msg_;
};

我的问题是,如果使用shared_ptr&lt;int&gt; 初始化类,shared_ptr 必须初始化:

this->msg_ = std::make_shared<T*>();

我试着这样解决它:

Foo<T>() {
    if (std::is_pointer<T>::value) {
      this->msg_ = std::make_shared<T*>();
    }
};

,但问题是必须在编译时解决。否则无法编译。

你知道解决这个问题的任何模式吗?

谢谢!和 最好的祝福 费边

【问题讨论】:

  • 如果Tstd::shared_ptr&lt;int&gt;std::make_shared&lt;T*&gt;() 将返回std::shared_ptr&lt;std::shared_ptr&lt;int&gt;*&gt;。为什么默认初始化不够? (此外,您尝试的不是初始化,而是赋值。)
  • 我正在使用一个回调方法std::function&lt;void(T&amp;)&gt; user_callback,它被this-&gt;user_callback(this-&gt;msg_) 调用。我遇到的问题是 msg shared_ptr 是函数内部的 nullptr,因此我的程序崩溃了。

标签: c++ templates shared-ptr


【解决方案1】:

你可能有专长

template <typename T>
class Foo {
public:
    Foo() {}
private:
    T msg_;
};
template <typename T>
class Foo<std::shared_ptr<T>>
{
public:
    Foo() : msg_(std::make_shared<T>()) {}
private:
    std::shared_ptr<T> msg_;
};

或创建函数来初始化(重载)

template <typename> struct tag{};

template <typename T>
T foo_default_init(tag<T>) { return {}; }

template <typename T>
std::shared_ptr<T> foo_default_init(tag<std::shared_ptr<T>>)
{
    return std::make_shared<T>();
}

template <typename T>
class Foo {
public:
    Foo() : msg_(foo_default_init(tag<T>{})){}
private:
    T msg_;
};

【讨论】:

  • 谢谢。您使用的是哪个 C++ 版本?第二个示例无法使用 C++11 为我编译
  • 已编辑:错字已修复。
  • 我刚刚测试过了,它解决了我的问题!谢谢!
猜你喜欢
  • 2014-01-20
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
相关资源
最近更新 更多