我对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()
的返回值存储在shared_ptr
中,而不必像t2
那样命名模板参数类型。
答案 0 :(得分:3)
避免一起使用原始指针。使用std::make_shared
和make_unique
(标准中不正确)而不是new
。然后auto
将很好地工作。 E.g。
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)...);
}
答案 1 :(得分: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 ... );
}