1

我对 C++11 很陌生,'仍然在尝试扩展。我发现auto关键字非常方便,尤其是在处理模板变量时。这意味着给定

template<typename ... Types>
struct Foo
{
};

template<typename ... Types>
Foo<Types ...>* create( Types ... types ... )
{
    return new Foo<Types ...>;
}

我现在可以做任务了

auto t1 = create( 'a' , 42 , true , 1.234 , "str" );

代替

Foo<char, int, bool, double , const char*>* t2 = create( 'a' , 42 , true , 1.234 , "str" );

现在的问题是,因为t1是一个指针,我想shared_ptr按照 Herb Sutter 的建议将它保存在一个指针中。因此,我想将 的返回值存储create()在 ashared_ptr而不必命名模板参数类型,如t2.

4

2 回答 2

2

避免一起使用原始指针。使用std::make_sharedand make_unique(在标准中不正确)而不是new. 然后auto会很好地工作。例如

template <typename ...Args>
auto create(Args&&... args)
    -> std::shared_ptr<Foo<typename std::decay<Args>::type...>>
{
    return std::make_shared<Foo<typename std::decay<Args>::type...>>(
        std::forward<Args>(args)...);
}
于 2012-10-20T20:35:04.627 回答
0

这太长了,不能作为评论发布。因此,我将其发布在这里。此外,它可能是一个答案。

@nosid 为什么不如下。它不那么复杂。

template<typename ... Types>
struct Foo
{
    Foo( Types ... types ... ) : m_data( types ...)
    {
    }

    std::tuple<Types...>    m_data;
};

template<typename ... Types>
std::shared_ptr<Foo<Types ...> > create( Types ... types ... )
{
    return std::make_shared<Foo<Types ...> >( types ... );
}
于 2012-10-20T22:21:21.900 回答