在编译时区分 shared_ptr 和普通类型
Differentiate between shared_ptr and normal type on compile time
我尝试创建一个模板化的 class,它将模板参数保存为一个成员变量 (msg_)。
现在 class 的输入应该允许像 int
和 shared_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_;
};
我尝试创建一个模板化的 class,它将模板参数保存为一个成员变量 (msg_)。
现在 class 的输入应该允许像 int
和 shared_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_;
};