Funkcja akceptująca funkcje jako parametr z typami szablonowymi

Dec 18 2020

jestem całkiem nowy w programowaniu i C ++. Mam funkcję, którą chcę zaakceptować wskaźniki funkcji z wartościami z szablonu jako argument. Oto, co mam na myśli ...

mam tę funkcję:

template<typename... ColumnTypes, typename... ParameterTypes>
   void query(std::function<void(bool success, ozo::rows_of<ColumnTypes...>& results)> callback, const 
   std::string& query, ParameterTypes&& ... parameters);

„ozo :: rows_of” to alias dla:

template <typename ... Ts>
   std::vector<std::tuple<Ts...>> 

Chcę, aby każde zapytanie otrzymywało oddzwonienie, które będzie konieczne, aby móc akceptować różne typy. na przykład. „Typy kolumn”

Co próbowałem:

void myfunc(bool succeeded, ozo::rows_of<int>& results)
{
     //code
}

postgres_caller->query(myfunc, "SELECT length FROM this_table WHERE id > $1 AND id < $2;", 11, 14);

wynik:

.cpp:241:26: error: no matching member function for call to 'query'
    postgres_caller->query(myfunc, "SELECT length FROM this_table WHERE id > $1 AND id < $2;", 11, 14);
    ~~~~~~~~~~~~~~~~~^~~~~

.h: 165: 22: uwaga: szablon kandydata zignorowano: nie można dopasować funkcji <void (bool, wektor <krotka <parametr-typu-0-0 ...>, alokator <krotka <parametr-typu-0-0 ...>>> &)> 'against' void (*) (bool, std :: vectorstd :: tuple <int, std :: assignatorstd :: tuple <int>> &) 'void PostgresCaller :: query (std :: function <void (bool success, ozo :: rows_of <ColumnTypes ...> & results)> callback, const std :: string & query, ParameterTypes && ... parameters)

Próbowałem też z lambdą:

postgres_caller->query([](bool succeeded, ozo::rows_of<int>& results)
                            {
                                //code
                            }, "SELECT length FROM this_table WHERE id > $1 AND id < $2;", 11, 14);

wynik:

error: no matching member function for call to 'query'
    postgres_caller->query([](bool succeeded, ozo::rows_of<int>& results)
    ~~~~~~~~~~~~~~~~~^~~~~

.h: 165: 22: uwaga: szablon kandydata zignorowano: nie można dopasować funkcji <void (bool, wektor <krotka <parametr-typu-0-0 ...>, alokator <krotka <parametr-typu-0-0 ...>>> &)> 'against' (lambda at .cpp: 241: 32) 'void PostgresCaller :: query (std :: function <void (bool success, ozo :: rows_of <ColumnTypes ...> & wyniki)> callback, const std :: string & query, ParameterTypes && ... parameters) ^

Czy jest to wykonalne i jak można to zrobić? bardzo cenione. /Jan

Odpowiedzi

1 super Dec 18 2020 at 23:02

Dedukcja szablonu działa tylko na dokładnym typie, który przekazujesz, więc jeśli przekażesz wskaźnik funkcji, szablon nie może wywnioskować, na jaki rodzaj std::functionprzekonwertować ten wskaźnik funkcji.

Ustaw wywoływalny parametr szablonu, zamiast używać std::function.

template<typename Callable, typename... ParameterTypes>
void query(Callable callback, const std::string& query, ParameterTypes&& ... parameters) {
    callback( ... ); // use it like this
}

W większości przypadków nie musisz wydedukować podpisu wywołania zwrotnego. Po prostu nazwij to z argumentami, których się spodziewasz.

Jeśli to nie wystarczy, istnieją sposoby, aby wydedukować również sygnaturę wywołania zwrotnego, ale staje się ona nieco bardziej szczegółowa i przez większość czasu nie służy żadnemu faktycznemu celowi.