#include <iostream>
#include <initializer_list>
#include <vector>
// aggregate type
struct Foo
{
int i;
char c;
};
// disaggregate type
struct Bar
{
private:
size_t d;
public:
// initializer-list constructor
Bar(std::initializer_list<int> initr)
: d{ initr.size() }
{}
int getD() const { return d; }
};
// display argument
template<typename Range>
void disp(Range const& rng)
{
std::cout << "{ ";
char const* sep = "";
for( auto const& x: rng)
{
std::cout << sep << x;
sep = ", ";
}
std::cout << " }" << std::endl;
}
template<>
void disp<Foo>( Foo const& foo )
{
std::cout << "{ " << foo.i << ", '" << foo.c << "' }" << std::endl;
}
template<>
void disp<Bar>( Bar const& bar )
{
std::cout << "{ " << bar.getD() << " }" << std::endl;
}
int main(int, char*[])
{
std::cout << "aggregate type" << std::endl;
int arr[3] = { 0, 1, 2 };
Foo foo = { 0, 'a' };
disp(arr);
disp(foo);
std::cout << "vector" << std::endl;
std::vector<int> v(0);
v.reserve(3);
v.push_back(0);
v.push_back(1);
v.push_back(2);
disp(v);
std::cout << "initializer-list" << std::endl;
Bar bar = { 1, 2, 3 };
disp(bar);
// possible to make a vector const
std::vector<int> const u = { 1, 2, 3 };
disp(u);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KI2luY2x1ZGUgPHZlY3Rvcj4KCi8vIGFnZ3JlZ2F0ZSB0eXBlCnN0cnVjdCBGb28KewoJaW50IGk7CgljaGFyIGM7Cn07CgovLyBkaXNhZ2dyZWdhdGUgdHlwZQpzdHJ1Y3QgQmFyCnsKcHJpdmF0ZToKCXNpemVfdCBkOwoKcHVibGljOgoJLy8gaW5pdGlhbGl6ZXItbGlzdCBjb25zdHJ1Y3RvcgoJQmFyKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxpbnQ+IGluaXRyKQoJCTogZHsgaW5pdHIuc2l6ZSgpIH0KCXt9CgoJaW50IGdldEQoKSBjb25zdCB7IHJldHVybiBkOyB9Cn07CgovLyBkaXNwbGF5IGFyZ3VtZW50CnRlbXBsYXRlPHR5cGVuYW1lIFJhbmdlPgp2b2lkIGRpc3AoUmFuZ2UgY29uc3QmIHJuZykKewoJc3RkOjpjb3V0IDw8ICJ7ICI7CgljaGFyIGNvbnN0KiBzZXAgPSAiIjsKCWZvciggYXV0byBjb25zdCYgeDogcm5nKQoJewoJCXN0ZDo6Y291dCA8PCBzZXAgPDwgeDsgCgkJc2VwID0gIiwgIjsKCX0KCXN0ZDo6Y291dCA8PCAiIH0iIDw8IHN0ZDo6ZW5kbDsKfQp0ZW1wbGF0ZTw+CnZvaWQgZGlzcDxGb28+KCBGb28gY29uc3QmIGZvbyApCnsKCXN0ZDo6Y291dCA8PCAieyAiIDw8IGZvby5pIDw8ICIsICciIDw8IGZvby5jIDw8ICInIH0iIDw8IHN0ZDo6ZW5kbDsKfQp0ZW1wbGF0ZTw+CnZvaWQgZGlzcDxCYXI+KCBCYXIgY29uc3QmIGJhciApCnsKCXN0ZDo6Y291dCA8PCAieyAiIDw8IGJhci5nZXREKCkgPDwgIiB9IiA8PCBzdGQ6OmVuZGw7Cn0KCgppbnQgbWFpbihpbnQsIGNoYXIqW10pCnsKCXN0ZDo6Y291dCA8PCAiYWdncmVnYXRlIHR5cGUiIDw8IHN0ZDo6ZW5kbDsKCWludCBhcnJbM10gPSB7IDAsIDEsIDIgfTsKCUZvbyBmb28gPSB7IDAsICdhJyB9OwoKCWRpc3AoYXJyKTsKCWRpc3AoZm9vKTsKCQoJc3RkOjpjb3V0IDw8ICJ2ZWN0b3IiIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6dmVjdG9yPGludD4gdigwKTsKCXYucmVzZXJ2ZSgzKTsKCXYucHVzaF9iYWNrKDApOwoJdi5wdXNoX2JhY2soMSk7Cgl2LnB1c2hfYmFjaygyKTsKCglkaXNwKHYpOwoKCXN0ZDo6Y291dCA8PCAiaW5pdGlhbGl6ZXItbGlzdCIgPDwgc3RkOjplbmRsOwoJQmFyIGJhciA9IHsgMSwgMiwgMyB9OwoJZGlzcChiYXIpOwoKCS8vIHBvc3NpYmxlIHRvIG1ha2UgYSB2ZWN0b3IgY29uc3QKCXN0ZDo6dmVjdG9yPGludD4gY29uc3QgdSA9IHsgMSwgMiwgMyB9OwoJZGlzcCh1KTsKCglyZXR1cm4gMDsKfQ==