2

データ メンバーwrapperをラップするクラスがあります。のコンストラクターがその引数を の ctor に転送するようにしstd::vector<int>ます。これを実装するために、可変個引数テンプレート コンストラクターを使用しようとしました。は ctor によって構築されるため、実行時にのctorをアクティブにしたいwrappervector<int>std::vector<int> v{1, 2, 3}std::initializer_listwrappervectorinitializer_list

wrapper mywrap{1, 2, 3}.

しかし、私は望ましい結果を得られませんでした:

#include <iostream>
#include <vector>

struct wrapper {
    std::vector<int> v;
    template <typename ...Tn> wrapper(Tn ...args) : v(args...) {}
};

int main() {
                                                            //----Output----
    wrapper wrap1{ 1 };
    std::cout << wrap1.v.size() << std::endl;               // 1
    std::cout << wrap1.v.at(0) << std::endl;                // 0
    wrapper wrap2{ 1, 2 };
    std::cout << wrap2.v.size() << std::endl;               // 1
    std::cout << wrap2.v.at(0) << std::endl;                // 2
    wrapper wrap3{ 1, 2, 3 };                               // error
    wrapper wrap4{ std::initializer_list<int>{ 1, 2, 3 } }; // OK
}

出力は次のとおりです。

wrapper wrap1{ 1 };を呼び出しますexplicit vector (size_type n);

wrapper wrap2{ 1, 2 };通話

vector (size_type n, const value_type& val, const allocator_type& alloc = allocator_type());.

wrapper wrap3が指定されていない場合は失敗しinitializer_list<int>ます。

vectorいずれの場合も、のinitializer_list<int>ctor をアクティブにしたかったのです。これはどのように修正できますか?

4

1 に答える 1

5

It's difference between initialization by () and initialization by {}, in your constructor you should also use {} initialization.

template <typename ...Tn> wrapper(Tn ...args) : v{args...} {}

By the way, if you want only initializer_list c-tor, why not simply write this c-tor?

wrapper(std::initializer_list<int> args) : v(args) {}
于 2013-12-18T13:29:51.017 に答える