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())>
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ámetroint
ficticio antes del parámetro variádicoArgs
. 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í: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: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…)>