ideas icon indicating copy to clipboard operation
ideas copied to clipboard

Сохранение Variadic Template через using

Open kin4stat opened this issue 3 years ago • 3 comments

Сделать возможным сохранять Variadic Template через using.

Например

template <typename Pointer>
struct function_traits;

template <typename Ret, typename Class, typename... Args>
struct function_traits<Ret(Class::*)(Args...)> {
    static constexpr auto args_count = sizeof...(Args);
    static constexpr auto function_convention = cconv::cthiscall;
    using args… = Class*, Args...;
    using return_type = Ret;
};

template <typename Ret, typename... Args>
struct function_traits<Ret(CCDECL*)(Args...)> {
    static constexpr auto args_count = sizeof...(Args);
    static constexpr auto convention = cconv::ccdecl;
    using args... = Args...;
    using return_type = Ret;
};
template <typename Ret, typename... Args>
struct function_traits<Ret(Args...)> {
    static constexpr auto args_count = sizeof...(Args);
    static constexpr auto convention = cconv::ccdecl;
    using args… = Args...;
    using return_type = Ret;
};

template<typename Function>
class Foo{
    using function = function_traits<Function>;
    using Args... = typename function::args;
    using Ret = typename function::return_type;
}

В текущих реалиях мы вынуждены сохранять variadic template в std::tuple(либо в своей обертке), что не всегда удобно. Например, чтобы распаковать аргументы обратно в шаблон, нам придется писать еще одну спецификацию под std::tuple

kin4stat avatar Dec 04 '21 15:12 kin4stat

using args… = Class*, Args...; Получается, что бесплатно получаем конкатенацию ?

sergii-rybin-tfs avatar Dec 06 '21 15:12 sergii-rybin-tfs

using args… = Class*, Args...; Получается, что бесплатно получаем конкатенацию ?

Ну можно и так. Даже если бы сделать что-то типа:

using args… = std::concatenate<Class*, Args>::type...;

будет все равно круто

kin4stat avatar Dec 06 '21 19:12 kin4stat

Ну можно и так. Даже если бы сделать что-то типа:

using args… = std::concatenate<Class*, Args>::type...;

будет все равно круто

Да, очень часто нужно или склеить паки, или отклеить (pop_back,pop_front).

А ещё чаще бывает нужно легкочитаемый людьми zip для 2х паков один из которых index_sequence.

sergii-rybin-tfs avatar Dec 07 '21 08:12 sergii-rybin-tfs