Удержание из типа возврата невозможно. Так что function2
не может быть выведено из ожидаемого типа возврата.
Однако можно вывести оператор приведения. Таким образом, вы можете заменить function2
вспомогательной структурой, такой как: К сожалению, нет стандартного синтаксиса для объявления оператора приведения к указателю на функцию без typedef, и вывод типа не будет работать через typedef. Следующее определение работает в некоторых компиляторах (работает в G ++ 4.5, не работает в VC ++ 9):
struct function2 {
template <typename T>
(*operator bool())(T) {
return function1<T>;
}
};
(см. Также Оператор преобразования C ++ для преобразования в указатель функции ).
Звонок должен выглядеть так же.
Примечание: C ++ 11 вводит альтернативный синтаксис typedef, который может быть шаблонным. Это было бы как:
struct function2 {
template <typename T>
using ftype = bool(*)(T);
template <typename T>
operator ftype<T>() {
return function1<T>;
}
};
но у меня нет ни G ++ 4.7, ни VC ++ 10, поэтому я не могу проверить, работает ли он на самом деле.
Объявление добавлено:
Хитрость в Boost.Lambda заключается в том, что он не возвращает функции, а функторы. И функторы могут быть шаблонами классов. Итак, у вас будет:
template<typename T>
bool function1(T some_var) { return true; }
class function2 {
template <typename T>
bool operator()(T t) {
function1<T>;
}
};
template <typename F>
void function3( F input_function ) { ... input_function(something) ... }
Теперь вы можете написать:
function3(function2);
и он будет разрешать шаблон внутри function3
. Все STL принимают функторы в качестве шаблонов, так что это будет работать со всеми STL.
Однако, если вы не хотите использовать function3
в качестве шаблона, есть способ. В отличие от указателя на функцию, шаблон std::function
(только C ++ 11, используйте boost::function
для более старых компиляторов) может быть создан из любого функтора (который включает простые указатели на функции). Итак, учитывая вышесказанное, вы можете написать:
void function3(std::function<bool ()(char)> input_function) { ... input_function(something) ... }
и теперь вы можете звонить:
function3(function2());
Дело в том, что std::function
имеет конструктор шаблонов, который внутренне генерирует оболочку шаблона и сохраняет указатель на его метод, который можно вызывать без дополнительных шаблонов.