Próbuję uzyskać liczbę parametrów w funkcji członka klasy.

template <typename R, typename ... Types> 
constexpr std::integral_constant<unsigned, sizeof ...(Types)> 
FuncArgCount(R(*f)(Types ...))
{
    return std::integral_constant<unsigned, sizeof ...(Types)>{};
}

class TestClass
{
public:
   TestClass(){}

   void On_Test(size_t v)
   {}

   void Call()
   {
       std::cout<< FuncArgCount(&TestClass::On_Test)::value;
   }
};

Powyższa implementacja szablonu jest pobierana z tego wątku i działa świetnie na temat funkcji trzecich Uzyskaj parametry funkcji .

0
0xBADF00 12 październik 2020, 09:16

1 odpowiedź

Najlepsza odpowiedź

Po pierwsze, musisz przeciążyć wskaźnik do członka. Wskaźniki do członka nie są wrażliwe, są one oddzielne reprezentujące przesunięcie wewnątrz typu.

template <typename R, typename T, typename ... Types> 
constexpr std::integral_constant<unsigned, sizeof ...(Types)> 
FuncArgCount(R(T::*)(Types ...))
{
    return std::integral_constant<unsigned, sizeof ...(Types)>{};
}

Po drugie, linia wyjściowa powinna być używana ., a nie ::

 std::cout<< FuncArgCount(&TestClass::On_Test).value;

Możesz też zwrócić tę wartość bezpośrednio z funkcji, afaik jest to bardziej logiczne podejście.

2
Swift - Friday Pie 12 październik 2020, 06:57