cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

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

Open kin4stat opened 2 years ago

kin4stat commented 2 years ago

Сделать возможным сохранять 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

sergii-rybin-tfs commented 2 years ago

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

kin4stat commented 2 years ago

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

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

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

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

sergii-rybin-tfs commented 2 years ago

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

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

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

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

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