読者です 読者をやめる 読者になる 読者になる

C++0x initializer_list(仮)

C++

cppllの天野さんのコードをもうちょっと遊んでみました


container_convertorと組み合わせることで、makeに型すら書かせない

#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>

using namespace std;

template <class Container>
class container_convertor {
    Container values_;
public:
    container_convertor(const Container& values)
        : values_(values) {}

    template <class Target>
    operator Target() const
    {
        return Target(values_.begin(), values_.end());
    }
};


template<class Container>
void do_make(Container&)
{
}

template <class Container, class Value, class... Values>
void do_make(Container& c, const Value& value, const Values&... values)
{
    c.push_back(value);
    do_make(c, values...);
}

template <class Value, class... Values>
container_convertor<vector<Value>> make(const Value& value, const Values&... values)
{
    vector<Value> v;
    v.reserve(sizeof...(Values) +1);
    v.push_back(value);
    do_make(v, values...);
    return container_convertor<vector<Value>>(v);
}

int main()
{
    vector<int> v = make(3, 1, 4); // !!!

    copy(v.begin(), v.end(), ostream_iterator<string>(cout, "\n"));
    return 0;
}


これもできる

list<int>      ls = make(3, 1, 4);
vector<string> v  = make("3", "1", "4");