As a workaround, moving Helper
outside of template class works.
Following may help:
namespace detail {
template <typename T, T value, T ... Elements>
struct ArrayHelper
{
constexpr ArrayHelper() {}
T array[sizeof...(Elements)] {Elements...};
constexpr T const * get() const { return array; }
};
template <std::size_t Size, typename T, T value, T ... Elements>
struct MakeArrayHelper
{
typedef typename MakeArrayHelper<Size - 1, T, value, value, Elements...>::type type;
};
template <typename T, T value, T ... Elements>
struct MakeArrayHelper<0, T, value, Elements...>
{
typedef ArrayHelper<T, Elements...> type;
};
} // namespace detail
template <typename T, size_t Size, T Value = T()>
struct Array
{
constexpr Array():
helper(),
array{helper.get()}
{}
typename detail::MakeArrayHelper<Size, T, Value>::type helper;
T const *array;
constexpr operator T const * () const { return array; }
};
Note that MakeArrayHelper
may be rewritten with recursion with Size / 2
instead of Size - 1
to allow bigger size (And so reach recursion limit for bigger Size).