Şablonlu tiplerde parametre olarak fonksiyon kabul eden fonksiyonlar

Dec 18 2020

Ben programlama ve C ++ için oldukça yeniyim. Değişken olarak şablonlu değerlere sahip işlev işaretçileri kabul etmek istediğim bir işlevim var. İşte demek istediğim ...

bu işleve sahibim:

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" şunun takma adıdır:

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

Her sorguya bir geri arama sağlanmasını istiyorum, bu geri aramanın farklı türleri kabul edebilmesi için ihtiyaç duyulacaktır. Örneğin. "Sütun Türleri"

Ne denedim:

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

sonuç:

.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: not: aday şablon yok sayıldı: 'işleviyle eşleşemedi <void (bool, vector <tuple <type-parameter-0-0 ...>, allocator <tuple <type-parameter-0-0 ...>>> &)> 'karşı' void (*) (bool, std :: vectorstd :: tuple <int, std :: allocatorstd :: tuple <int>> &) 'void PostgresCaller :: query (std :: function <void (bool başarısı, ozo :: rows_of <ColumnTypes ...> & sonuçlar)> geri arama, const std :: string & query, ParameterTypes && ... parametreler)

Lambda ile de denedim:

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

sonuç:

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

.h: 165: 22: not: aday şablon yok sayıldı: 'işleviyle eşleşemedi <void (bool, vector <tuple <type-parameter-0-0 ...>, allocator <tuple <type-parameter-0-0 ...>>> &)> 'karşı' (.cpp'deki lambda: 241: 32) 'void PostgresCaller :: query (std :: function <void (bool success, ozo :: rows_of <ColumnTypes ...> & sonuçlar)> callback, const std :: string & query, ParameterTypes && ... parameters) ^

Bu yapılabilir mi ve nasıl yapılabilir? çok minnettarım. /John

Yanıtlar

1 super Dec 18 2020 at 23:02

Şablon kesintisi yalnızca aktardığınız tam tür üzerinde çalışır, bu nedenle bir işlev işaretçisini iletirseniz, şablon std::functionbu işlev işaretçisinin ne tür bir değere dönüştürüleceğini çıkaramaz .

Kullanmak yerine çağrılabilir olanı bir şablon parametresi yapın std::function.

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

Çoğu zaman geri aramanın imzasını çıkarmanıza gerek yoktur. Sadece almasını beklediğiniz argümanlarla adlandırın.

Bu yeterli değilse, geri aramanın imzasını da çıkarmanın yolları vardır, ancak biraz daha ayrıntılı olur ve çoğu zaman gerçek bir amaca hizmet etmez.