构造智能指针数据类型和普通数据类型的通用方法

问题描述 投票:0回答:1

我想写一种构造类型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 auto x1 = create< SomeType >( 1, 2, 3 );
const auto x2 = create< std::unique_ptr<SomeType> >( 1, 2, 3 );
c++ smart-pointers generic-programming
1个回答
0
投票

您可能以某种间接方式使用重载:

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)...);
}
© www.soinside.com 2019 - 2024. All rights reserved.