0

コンパイル時に生成されるポリモーフィック型の配列が必要です。配列へのアクセスは実行時に指示されます (それ以外の場合はタプルを使用します)。配列がunique_ptrを介してその要素を所有することを望みます。現在、可変個引数テンプレートを使用して配列を作成しています。私がやろうとしていることの簡略化されたバージョン (MSVC 2012 November CTP):

#include "stdafx.h"
#include <array>
#include <memory>
#include <tuple>
#include <initializer_list>
#include <iostream>

using namespace std;

class foo { };
class bar : public foo { };
class wiz : public foo { };

struct house
{
    template<class... args>
    struct furniture
    {
        typedef tuple<args...> t;

        static std::array<unique_ptr<foo>, tuple_size<t>::value> make()
        {
            std::array<unique_ptr<foo>, tuple_size<t>::value> l = { unique_ptr<args>(new args())... }; 
            return l;
        }
    };

    typedef furniture<bar, wiz> td;
};

int _tmain(int argc, _TCHAR* argv[])
{
    auto result = house::td::make();

    return 0;
}

残念ながら、次のコンパイラ エラーが表示されます。

error C2248: 'std::unique_ptr<foo,std::default_delete<_Ty>>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<foo,std::default_delete<_Ty>>'

これは、イニシャライザ リストはコピーを通じて機能しますが、unique_ptr はコピーできないためです。これは、必要な動作を提供する shared_ptr (または生のポインター) を使用して回避できますが、このように unique_ptr の配列を作成する方法があるかどうかに興味があります。私はまだ可変個引数テンプレートに頭を悩ませようとしています。

4

2 に答える 2

0

RHS はunique_ptrs で初期化する必要がありますか? sunique_ptrコンストラクターは使用できませんか? 試してみましたか

std::array<unique_ptr<foo>, tuple_size<t>::value> l = { new args()... }; 
于 2013-01-02T06:10:24.633 に答える
0

あなたがやりたいことは本質的に機能します:

std::array<unique_ptr<foo>, tuple_size<t>::value> l = { unique_ptr<args>(new args())... };

一時的なものから構築しているとコンパイルされ(MSVCでも!)、ムーブコンストラクターが呼び出されます(そうでない場合は、追加std::moveすると修正されます)。

次にやろうとしていることは、次のことではありません。

return l;

コピーできないunique_ptrsの配列を値で返そうとしているためです。

于 2013-01-02T06:50:13.830 に答える