Неправильно ли передавать функцию в шаблон класса, как указано выше?
Да. Потому что вы, другими словами, хотите, чтобы компилятор выводил параметр type для шаблона класса, что просто невозможно в C ++. Напомним, что fun
сам по себе не является типом , его значением типа void (*)()
. Но ваш шаблон класса ожидает тип, а не значение. Вот почему это не сработает.
Вывод типа возможен только с функциями, то есть даже с конструктором класса. Так что если вы пишете шаблонный конструктор, а затем вы можете написать это:
Declare obj(&fun);
Здесь тип функции известен, пока вы находитесь в конструкторе, как только вы существуете из него, вы теряете информацию. Итак, что вам, вероятно, нужно: определить класс, скажем, AbstractFunctor
(возможно, шаблон класса) и, исходя из него, определить другой класс, скажем template<Fun fun> struct Functor
. Затем вы можете создать экземпляр Functor
, который может запомнить тип функции навсегда, и сохранить экземпляр в AbstractFunctor*
как данные-члены Declare
.
Но я думаю, что даже в этом случае тип нельзя использовать как Declare::Type
или Declare::AbstractFunctor::Type
, просто потому, что тип * хранится в экземпляре класса ; только экземпляр знает тип . Таким образом, получение типа с использованием синтаксиса типа A::Type
не может быть и речи. И вы не можете получить тип с использованием синтаксиса instance.Type
либо. Все, что вы можете сделать, это: вызвать функцию, используя instance , как функтор.
EDIT:
Если вам разрешено использовать другие функции C ++ 0x (кроме auto), тогда проблема имеет тривиальное решение:
Declare<decltype(&fun)>::Type pf = &fun;
pf(); //call the function
Демо: http://ideone.com/
Но тогда вам даже не нужно даже Declare
, поскольку вы можете сделать это вместо этого:
decltype(&fun) pf = &fun;
pf(); //call the function