#include <iostream>
#include <array>
#include <string>
#include <type_traits>
#include <iomanip>
const int ARRAY_SIZE = 5;
template <typename C>
class ValArray
{
public:
template<typename T = C, typename std::enable_if<std::is_same<T, bool>::value, int>::type = 0>
ValArray() { _values.fill(false); }
template<typename T = C, typename std::enable_if<!std::is_same<T, bool>::value, int>::type = 0>
ValArray() { }
ValArray(const ValArray&) = delete;
C& operator[](size_t pos) { return _values[pos]; }
// ...
private:
std::array<C, ARRAY_SIZE> _values;
};
int main()
{
std::cout << std::boolalpha;
ValArray<int> val1;
for(int i = 0; i < ARRAY_SIZE; ++i) {
std::cout << "val1[" << i << "] = " << val1[i] << std::endl;
}
std::cout << std::endl;
ValArray<bool> val2;
for(int i = 0; i < ARRAY_SIZE; ++i) {
std::cout << "val2[" << i << "] = " << val2[i] << std::endl;
}
std::cout << std::endl;
ValArray<std::string> val3;
for(int i = 0; i < ARRAY_SIZE; ++i) {
std::cout << "val3[" << i << "] = \"" << val3[i] << "\"" << std::endl;
}
std::cout << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXJyYXk+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KI2luY2x1ZGUgPGlvbWFuaXA+Cgpjb25zdCBpbnQgQVJSQVlfU0laRSA9IDU7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgQz4KY2xhc3MgVmFsQXJyYXkKewpwdWJsaWM6Cgl0ZW1wbGF0ZTx0eXBlbmFtZSBUID0gQywgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19zYW1lPFQsIGJvb2w+Ojp2YWx1ZSwgaW50Pjo6dHlwZSA9IDA+CiAgICBWYWxBcnJheSgpIHsgX3ZhbHVlcy5maWxsKGZhbHNlKTsgfQoKCXRlbXBsYXRlPHR5cGVuYW1lIFQgPSBDLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhc3RkOjppc19zYW1lPFQsIGJvb2w+Ojp2YWx1ZSwgaW50Pjo6dHlwZSA9IDA+CiAgICBWYWxBcnJheSgpIHsgfQogICAgCiAgICBWYWxBcnJheShjb25zdCBWYWxBcnJheSYpID0gZGVsZXRlOwoKICAgIEMmIG9wZXJhdG9yW10oc2l6ZV90IHBvcykgeyByZXR1cm4gX3ZhbHVlc1twb3NdOyB9CgogICAgLy8gLi4uCnByaXZhdGU6CiAgICBzdGQ6OmFycmF5PEMsIEFSUkFZX1NJWkU+IF92YWx1ZXM7Cn07CgppbnQgbWFpbigpCnsKCXN0ZDo6Y291dCA8PCBzdGQ6OmJvb2xhbHBoYTsKCglWYWxBcnJheTxpbnQ+IHZhbDE7Cglmb3IoaW50IGkgPSAwOyBpIDwgQVJSQVlfU0laRTsgKytpKSB7CgkJc3RkOjpjb3V0IDw8ICJ2YWwxWyIgPDwgaSA8PCAiXSA9ICIgPDwgdmFsMVtpXSA8PCBzdGQ6OmVuZGw7IAoJfQoJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCglWYWxBcnJheTxib29sPiB2YWwyOwoJZm9yKGludCBpID0gMDsgaSA8IEFSUkFZX1NJWkU7ICsraSkgewoJCXN0ZDo6Y291dCA8PCAidmFsMlsiIDw8IGkgPDwgIl0gPSAiIDw8IHZhbDJbaV0gPDwgc3RkOjplbmRsOyAKCX0KCXN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CgoJVmFsQXJyYXk8c3RkOjpzdHJpbmc+IHZhbDM7Cglmb3IoaW50IGkgPSAwOyBpIDwgQVJSQVlfU0laRTsgKytpKSB7CgkJc3RkOjpjb3V0IDw8ICJ2YWwzWyIgPDwgaSA8PCAiXSA9IFwiIiA8PCB2YWwzW2ldIDw8ICJcIiIgPDwgc3RkOjplbmRsOyAKCX0KCXN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CgoJcmV0dXJuIDA7Cn0=