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" );

ここでの問題は、ポインターが Herb Sutter が推奨t1するように保持したいということです。したがって、 のようにテンプレート引数の型に名前を付けずに、 の戻り値をashared_ptrに格納したいと思います。create()shared_ptrt2

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 に答える