es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obtenga el tipo de argumentos con un argumento predefinido.

En c++, quiero obtener el tipo de los argumentos de una función.
El problema es que no quiero obtener el tipo de todos los argumentos, solo los que vienen después del primero.

“`template
struct FuncTraits : FuncTraits<decltype(&t::operator())> {};

template <typename c,="" typename="" r,="" typename…="" args="">
struct FuncTraits<r(c::<em>)(args…) const=""> : FuncTraits<void(</em>)(args…)> {};

template <typename… args=""> struct FuncTraits<void(*)(args…)> {
using ArgCount = std::integral_constant<std::size_t, sizeof…(args)="">;
using ArgsType = std::tuple<typename></typename><args>::type…>;
};“`

En este ejemplo se obtiene el tipo para todos los argumentos, pero quiero algo más como esto.

“`template
struct FuncTraits : FuncTraits<decltype(&t::operator())> {};

template <typename c,="" typename="" r,="" typename…="" args="">
struct FuncTraits<r(c::<em>)(int, args…)="" const=""> : FuncTraits<void(</em>)(int unused,="" args…)=""> {};

template <typename… args=""> struct FuncTraits<void(*)(int unused,="" args…)=""> {
using ArgCount = std::integral_constant<std::size_t, sizeof…(args)="">;
using ArgsType = std::tuple<typename></typename><args>::type…>;
};“`

Sin embargo, esto no logra compilar por completo.
¿Cómo puedo lograr algo como esto?</std::size_t,></void()(int></typename…></void()(int></r(c::)(int,></decltype(&t::operator())></std::size_t,></void()(args…)></typename…></void()(args…)></r(c::)(args…)></decltype(&t::operator())>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener el tipo de los argumentos de una función en C++, pero solo a partir del segundo argumento y en adelante, puedes modificar las plantillas utilizadas en la estructura FuncTraits. Específicamente, en la plantilla para punteros a funciones (FuncTraits<void(*)(args...)>), puedes agregar un parámetro int ficticio antes del parámetro variádico Args. Esto te permitirá omitir el primer argumento y aún así obtener los tipos de los argumentos restantes.

    Por ejemplo, la estructura FuncTraits modificada se vería así:

    template <typename t="">
    struct FuncTraits : FuncTraits<decltype(&t::operator())> {};
    
    template <typename c,="" typename="" r,="" typename...="" args="">
    struct FuncTraits<r(c::*)(args...) const=""> : FuncTraits<void(int, args...)=""> {};
    
    template <typename... args="">
    struct FuncTraits<void(int, args...)=""> {
        using ArgCount = std::integral_constant<std::size_t, sizeof...(args)="">;
        using ArgsType = std::tuple<typename></typename><args>::type...>;
    };
    

    De esta manera, cuando uses FuncTraits para obtener los tipos de argumentos de un puntero a función, puedes utilizar la especialización de plantilla modificada que omite el primer argumento:

    void foo(int x, float y, char z);
    using Traits = FuncTraits<decltype(&foo)>;
    using Args = std::tuple_element_t<1, typename Traits::ArgsType>; // Args ahora es std::tuple<float, char="">
    

    Ten en cuenta que este método asume que el primer argumento siempre es de tipo int. Si necesitas omitir un argumento de un tipo diferente, puedes modificar el parámetro ficticio en consecuencia.</float,></decltype(&foo)></std::size_t,></void(int,></typename…></void(int,></r(c::)(args…)></decltype(&t::operator())></void()(args…)>

Comments are closed.