构造智能指向数据类型和普通数据类型的通用方法
Generic way of constructing smart pointed data types as well as normal data types
考虑到 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)...);
}
考虑到 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)...);
}