在编译时区分 shared_ptr 和普通类型

Differentiate between shared_ptr and normal type on compile time

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

这样的普通类型
template <typename T>
class Foo {
 public:
  Foo<T>() {};
 private:
  T msg_;
};

我的问题是如果 class 使用 shared_ptr<int> 初始化,shared_ptr 必须初始化:

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

我试过这样解决:

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

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

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

谢谢!和 最好的祝福 法比安

你可能有专长

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_;
};