przekazywanie funkcji do funkcji przez referencję

0

Witam

w jaki sposób określić, że funkcja - przekazywana przez referencję do innej funkcji - powinna zwracać jakiś typ, np. bool ?

    template<typename Func>
    void matrix_loop(const Func &f)
    {
        for(uint8_t row = 0; row < MATRIX_ROWS; ++row)
        {
            for(uint8_t col = 0; col < MATRIX_COLS; ++col)
            {
                if(f(row, col))
                    return;
            }
        }
    }

powyższy kod oczywiście nie działa i kompilator krzyczy: value of type 'void' is not contextually convertible to 'bool'

0

Nie ma potrzeby wykorzystywania szablonów - wklep c++ function pointers w Google, a znajdziesz kilka rozwiązań :-)

0

Możesz użyć funktorów (function object).

5
Patryk27 napisał(a):

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):

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):

    template<typename Func>
    void matrix_loop(Func &&f) // perfect forwarding
    {

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:

    template<typename Func>
    std::enable_if<std::is_same<std::result_of<Func(int, int)>::type, bool>::value>::type
    matrix_loop(Func &&f) // perfect forwarding
    {

Dla porządku wersja ze wskaźnikiem:

void matrix_loop(bool (*f)(int,int))
{

Jest jeszcze możliwość użycia static_assert (jako namiastka konceptów):

    template<typename Func>
    void matrix_loop(Func &&f) // perfect forwarding
    {
        static_assert(std::is_same<std::result_of<Func(int, int)>::type, bool>::value, "Func must return 'bool' type");

1 użytkowników online, w tym zalogowanych: 0, gości: 1