c++ - 构造智能指向数据类型以及普通数据类型的通用方法
问题描述
我想写一个通用的方法来构造一个类型T
,考虑到T
我实际想要构造的数据的智能指针的情况。就像是:
template < typename T, typename... Args >
auto
create( Args... args )
{
return T{args...};
}
template < typename std::unique_ptr< typename T >, typename... Args >
auto
create( Args... args )
{
return std::make_unique< T >( args... );
}
template < typename std::shared_ptr< typename T >, typename... Args >
auto
create( Args... args )
{
return std::make_shared< T >( args... );
}
这样它当然不会编译。这只是为了解释粗略的想法。我需要两个更具体的重载,它们仍然足够通用来完成这项工作。
调用者代码应该能够执行以下操作:
const SomeType x1 = create<SomeType>(1, 2, 3);
const std::unique_ptr<SomeType> x2 = create<std::unique_ptr<SomeType>>(1, 2, 3);
解决方案
您可能会以这种方式使用重载,并带有一些间接性:
template <typename T> struct Tag{};
template <typename T, typename... Args>
auto create_impl(Tag<T>, Args&&... args)
{
return T{std::forward<Args>(args)...};
}
template < typename T, typename... Args >
auto create_impl(Tag<std::unique_ptr<T>>, Args&&... args)
{
return std::make_unique<T>(std::forward<Args>(args)...);
}
template < typename T, typename... Args >
auto create_impl(Tag<std::shared_ptr<T>>, Args&&... args)
{
return std::make_shared<T>(std::forward<Args>(args)...);
}
template <typename T, typename... Args>
auto create(Args&&... args)
{
return create_impl(Tag<T>{}, std::forward<Args>(args)...);
}
推荐阅读
- android - Android 布局 ID 无法识别
- asp.net-mvc - SignalR 应用程序中的握手期间 Web Socket 失败
- c# - 如何将我的剃刀模型的属性传递给部分?
- python-3.x - 为什么我无法使用 SQLAlchemy 连接到 Oracle DB?
- linux - 从 grep 获取特定输出
- vba - 即使表单打开也无法访问 VBA 字段
- r - 对同一数据框中共享除两个观察值之外的所有观察值的行求和
- java - Android:无法应用 AsyncTask 的 execute() 方法。为什么?
- html - How to add margin to an HTML element?
- javascript - How to make window size responsive in Electron. (On the opening of the app)