ideas
ideas copied to clipboard
Сохранение Variadic Template через using
Сделать возможным сохранять 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
using args… = Class*, Args...;
Получается, что бесплатно получаем конкатенацию ?
using args… = Class*, Args...;Получается, что бесплатно получаем конкатенацию ?
Ну можно и так. Даже если бы сделать что-то типа:
using args… = std::concatenate<Class*, Args>::type...;
будет все равно круто
Ну можно и так. Даже если бы сделать что-то типа:
using args… = std::concatenate<Class*, Args>::type...;будет все равно круто
Да, очень часто нужно или склеить паки, или отклеить (pop_back,pop_front).
А ещё чаще бывает нужно легкочитаемый людьми zip для 2х паков один из которых index_sequence.