Можно ли передать шаблон функции в качестве аргумента шаблона?

Предположим, что у нас есть функция шаблона:

template<typename T1, typename T2, typename T3>
T3 such_fun(T1 a, T2 b) {
    // do something...
}

, и теперь мы хотим использовать ее в качестве аргумента в другом шаблоне, например вот так

template<typename T1, template<typename, typename, typename> some_function>
void big_fun(T1 a) {
   // some code...
   a = some_function<T1, T1, T1>(a, a);
   // some code...
}

Возможно ли?

Я знаю, что могу использовать структуру с оператором defined (). Мне просто интересно узнать о функциях.

РЕДАКТИРОВАТЬ:

Пока я писал этот вопрос, мой друг нашел частичное решение:

template<typename T1, T1 (*some_function)(T1, T1)>
void big_fun(T1 a) {
   // some code...
   a = some_function(a, a);
   // some code...
}

Но все же - мне любопытно, возможно ли это без материализации типа функции перед вызовом. Например - я могу вызвать переданный шаблон с различными комбинациями типов:

template<typename T1, typename T2, template<typename, typename, typename> some_function>
void big_fun(T1 a, T2 b) {
   // some code...
   a = some_function<T1, T1, T1>(a, a);
   a = some_function<T1, T2, T1>(a, b);
   b = some_function<T2, T2, T2>(b, b);
   b = some_function<T2, T1, T2>(b, a);
   // some code...
}
10
задан Wojciech Żółtak 24 February 2012 в 18:35
поделиться