Пакет параметров и std :: array - PullRequest
0 голосов
/ 25 апреля 2020

Я полагаю, что об этом спрашивали ранее здесь , но я могу ошибаться. Можно ли упаковать параметры для std::array?

    template < typename _Ty , typename... _Rest > requires _sqrable_variadic_operation < _Ty , _Rest... >
        auto accumulated_sqr ( _Ty n , _Rest... q ) { return sqrof ( n , q... ); };
        // Element container of size _Sz and type of _Ty.
        std::array < _Ty , _Sz > m_Elems;
    public:
        . . .
        auto length ( void ){
            return accumulated_sqr ( m_Elems  );
        };

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

std::array поддерживает подобный кортежу интерфейс, что означает, что вы можете использовать std::apply для извлечения его элементов в список аргументов вызываемого объекта:

auto length() const
{
    return std::apply([](auto&&... qs) { return accumulated_sqr(decltype(qs)(qs)...); }, m_Elems);
}

DEMO

1 голос
/ 25 апреля 2020

Да, можно использовать std::index_sequence в качестве помощника:

template <std::size_t Sz = 2 , typename Ty = float>
class vector {
protected:
    using Elem_Container_t = std::array<Ty , Sz>;
    Elem_Container_t m_Elems;

    template <std::size_t... Is>
    auto length_impl(std::index_sequence<Is...>)
    {
        return concepts::accumulated_sqr(m_Elems[Is]...);
    }
public:
    template <typename... Ts>
    vector (Ts... elems) : m_Elems {elems... } { }

    auto length()
    {
        return length_impl(std::make_index_sequence<Sz>());
    }
};

Live Demo


Примечание: имена, начинающиеся с подчеркивания, следуют за заглавные буквы зарезервированы для реализации. Вы не можете использовать имена, такие как _Sz или _Ty в вашей программе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...