#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;
}