Возможно ли использовать typedef в шаблонной подписи функции?

#c #templates #c 11 #typedef

#c #шаблоны #c 11 #typedef

Вопрос:

Есть ли способ использовать typedef в качестве аргумента шаблонной функции? Или способ определения типа в качестве аргумента?

допустим, я хочу передать указатель на функцию этой функции :

 template<typename C, typename ...Args>
void test(typedef void (C::*functor)(Args... args) functor f)
{
   f(args...);
}
  

Комментарии:

1. Придирка: я знаю, что это сбивает с толку, но указатель на функцию-член не является ни указателем на функцию, ни указателем. (Интересное чтение по теме: blogs.msdn.com/themes/blogs/generic /… )

Ответ №1:

Нет, вы не можете создать typedef в параметре. Если ваша цель — избежать повторения типа параметра в теле функции, вы можете использовать decltype :

 template<typename C, typename ...Args>
void test(void (C::*f)(Args...))
{
   typedef decltype(f) functor;
}
  

Ответ №2:

Нет.

Но зачем вам это вообще нужно, когда вы можете написать это:

 template<typename C, typename ...Args>
void test(void (C::*f)(Args...), Args... args)
{
   C c;   //f is a member function, so need an instance of class
   (c.*f)(args...);  //call the function using the instance.
}
  

Или вы можете передать экземпляр вместе с аргументами или сделать что-то еще. Я предполагаю, что это просто проверка концепции, и в реальном коде было бы что-то еще.