Nie ma potrzeby wykorzystywania szablonów - wklep c++ function pointers
w Google, a znajdziesz kilka rozwiązań :-)
Wskaźniki na funkcje to jest przeżytek w C++ i spadek po C
. Lepiej ich unikać.
A co do tematu, wersja łatwa bez szablonów (ale wolniejsze od wskaźników):
Kopiuj
void matrix_loop(std::function(bool(int,int)))
{
Zlalety łatwe przyjemne może być częścią API dll.
Wersja szablonowa, szybsza nawet od wskaźników (byłeś blisko):
Kopiuj
template<typename Func>
void matrix_loop(Func &&f)
{
Normalnie olewa się to, że tam ma być coś innego i w razie problemów czyta okropne błędy szablonów.
W C++20 będą koncepty, gdzie wyraźnie można określić wymagania co do typu Func
W C++11 da się jednak coś temu zaradzić korzystając ze SFINAE:
Kopiuj
template<typename Func>
std::enable_if<std::is_same<std::result_of<Func(int, int)>::type, bool>::value>::type
matrix_loop(Func &&f)
{
Dla porządku wersja ze wskaźnikiem:
Kopiuj
void matrix_loop(bool (*f)(int,int))
{
Jest jeszcze możliwość użycia static_assert
(jako namiastka konceptów):
Kopiuj
template<typename Func>
void matrix_loop(Func &&f)
{
static_assert(std::is_same<std::result_of<Func(int, int)>::type, bool>::value, "Func must return 'bool' type");
static_assert