Рассмотрим класс шаблона, например:
template<typename ReturnType, ReturnType Fn()>
class Proxy
{
void run()
{
ReturnType ret = Fn();
// ... do something ...
}
};
// and a functions
int fn1() { return 5; }
float fn2() { return 5; }
Это можно создать с помощью:
Proxy<int, &fn1> p1;
Но явное объявление типа возвращаемого значения кажется ненужным. Я пытаюсь достичь чего-то вроде:
someProxyInstantation<&fn1> p1;
someProxyInstantation<&fn2> p2;
К сожалению, я не ожидаю c ++, и это похоже на скрытый угол языка (по крайней мере, для меня).
Если бы я мог просто перейти от указателя на функцию к ее типу - что-то вроде:
std :: tr1 :: result_of <& fn> :: type // Ошибка 1 ошибка C2923: «std :: tr1 :: result_of»: «fn1» не является допустимым аргументом типа шаблона для параметра «_Fty»
ошибка имеет смысл, поскольку параметр вообще не является "типом"
C ++ 0x имеет тип decl (& fn1), но это через несколько лет.
Есть ли способ сделать это в C ++ 03 (+ tr1)?
Ограничения:
- Я не хочу передавать функтор, f1 и f2 должны оставаться глобальными функциями, которые имеют возвращаемое значение (не может переместить его в параметр).)