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