| #include <string>
#include <iostream>
#include <cstdint>
namespace utils {
template<class T, size_t N>
constexpr size_t sizeOfArray(T (&)[N])
{
return N;
}
} // namespace utils
template<std::size_t ArrayMaxSize, typename ValueType>
//constexpr
std::size_t unpackParamPackToStaticBufferHelper2(std::size_t idx, ValueType *pArray)
{
// static_assert( idx<=ArrayMaxSize
// , "unpackParamPackToStaticBufferHelper: index is out of array size"
// );
//pArray[idx] = v;
return idx;
}
template<std::size_t ArrayMaxSize, typename ValueType, typename InitializerFirstType, typename... InitializerListType>
//constexpr
std::size_t unpackParamPackToStaticBufferHelper2(std::size_t idx, ValueType *pArray, InitializerFirstType firstInit, InitializerListType... inits)
{
// f(&args...); // “&args...” is a pack expansion
// // “&args” is its pattern
// static_assert( idx<ArrayMaxSize
// , "unpackParamPackToStaticBufferHelper: index is out of array size"
// );
pArray[idx] = firstInit;
return unpackParamPackToStaticBufferHelper2<ArrayMaxSize>(idx+1, pArray, pArray, inits...);
}
template<std::size_t ArrayMaxSize, typename ValueType, typename InitializerFirstType, typename... InitializerListType>
//constexpr
std::size_t unpackParamPackToStaticBufferHelper(ValueType *pArray, InitializerFirstType firstInit, InitializerListType... inits)
{
return unpackParamPackToStaticBufferHelper2<ArrayMaxSize>(0, pArray, std::forward<InitializerListType>(inits) ...);
}
template<typename ValueType, std::size_t N, typename InitializerFirstType, typename... InitializerListType>
//constexpr
std::size_t unpackParamPackToArrayHelper(ValueType (&arr)[N], InitializerFirstType firstInit, InitializerListType... inits)
{
//return unpackParamPackToStaticBufferHelper2<al_martyn1::sizeOfArray(arr)>(0, arr /* &arr[0] */ , std::forward<InitializerListType>(inits) ...);
return unpackParamPackToStaticBufferHelper<utils::sizeOfArray(arr)/*, ValueType, InitializerFirstType,*/ >(arr /* &arr[0] */ , std::forward<InitializerListType>(inits) ...);
}
int main()
{
int intArray[10];
//constexpr
std::size_t size = unpackParamPackToArrayHelper(intArray, 1, 3, 5, 7);
std::cout << "Size: " << size << "\n";
for(std::size_t i=0; i!=size; ++i)
{
std::cout << "array["<<i<<"]: " << intArray[i] << "\n";
}
}
|