Подскажите за параметр пак
От: пффф  
Дата: 17.06.24 17:04
Оценка:
Привет!

Хочу распаковать параметр пак в массив. Чет не выходит каменный цветок

Подразумевается, что аргументы того же типа, что и массив, или могут сконвертироваться в элемент массива. Если не так, то ошибка компиляции меня устроит.

Да, в идеале чтобы это на этапе компиляции работало.

А ещё лучше — чтобы можно было сделать как-то так, не через вызов функции, а задавая параметры для шаблона:

template<int Params...>
struct MyStruct
{
    constexpr int           arr[20]; // Больше 20 нельзя
    constexpr std::size_t   actualNumItems = ??? Params...

};

MyStruct<1,2,7>  ms127;


https://gcc.godbolt.org/z/jPxjdKhKb


  Код
    #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";
    }

}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.