@@ -223,6 +223,19 @@ namespace sqlite {
223223 template <typename T> friend database_binder& operator <<(database_binder& db, const std::unique_ptr<T>& val);
224224 template <typename T> friend void get_col_from_db (database_binder& db, int inx, std::unique_ptr<T>& val);
225225 template <typename T> friend T operator ++(database_binder& db, int );
226+ // for nontemplate functions
227+ friend database_binder& operator <<(database_binder& db, const int & val);
228+ friend void get_col_from_db (database_binder& db, int inx, int & val);
229+ friend database_binder& operator <<(database_binder& db, const sqlite_int64& val);
230+ friend void get_col_from_db (database_binder& db, int inx, sqlite3_int64& i);
231+ friend database_binder& operator <<(database_binder& db, const float & val);
232+ friend void get_col_from_db (database_binder& db, int inx, float & f);
233+ friend database_binder& operator <<(database_binder& db, const double & val);
234+ friend void get_col_from_db (database_binder& db, int inx, double & d);
235+ friend void get_col_from_db (database_binder& db, int inx, std::string & s);
236+ friend database_binder& operator <<(database_binder& db, const std::string& txt);
237+ friend void get_col_from_db (database_binder& db, int inx, std::u16string & w);
238+ friend database_binder& operator <<(database_binder& db, const std::u16string& txt);
226239
227240
228241#ifdef _MODERN_SQLITE_BOOST_OPTIONAL_SUPPORT
@@ -350,7 +363,6 @@ namespace sqlite {
350363 Values&&... values
351364 ) {
352365 nth_argument_type<Function, sizeof ...(Values)> value{};
353- get_col_from_db (db, sizeof ...(Values), value);
354366
355367 run<Function>(db, function, std::forward<Values>(values)..., std::move (value));
356368 }
@@ -370,15 +382,15 @@ namespace sqlite {
370382 };
371383
372384 // int
373- template <> inline database_binder& operator <<(database_binder& db, const int & val) {
385+ inline database_binder& operator <<(database_binder& db, const int & val) {
374386 int hresult;
375387 if ((hresult = sqlite3_bind_int (db._stmt .get (), db._inx , val)) != SQLITE_OK) {
376388 exceptions::throw_sqlite_error (hresult);
377389 }
378390 ++db._inx ;
379391 return db;
380392 }
381- template <> inline void get_col_from_db (database_binder& db, int inx, int & val) {
393+ inline void get_col_from_db (database_binder& db, int inx, int & val) {
382394 if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
383395 val = 0 ;
384396 } else {
@@ -387,7 +399,7 @@ namespace sqlite {
387399 }
388400
389401 // sqlite_int64
390- template <> inline database_binder& operator <<(database_binder& db, const sqlite_int64& val) {
402+ inline database_binder& operator <<(database_binder& db, const sqlite_int64& val) {
391403 int hresult;
392404 if ((hresult = sqlite3_bind_int64 (db._stmt .get (), db._inx , val)) != SQLITE_OK) {
393405 exceptions::throw_sqlite_error (hresult);
@@ -396,7 +408,7 @@ namespace sqlite {
396408 ++db._inx ;
397409 return db;
398410 }
399- template <> inline void get_col_from_db (database_binder& db, int inx, sqlite3_int64& i) {
411+ inline void get_col_from_db (database_binder& db, int inx, sqlite3_int64& i) {
400412 if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
401413 i = 0 ;
402414 } else {
@@ -405,7 +417,7 @@ namespace sqlite {
405417 }
406418
407419 // float
408- template <> inline database_binder& operator <<(database_binder& db, const float & val) {
420+ inline database_binder& operator <<(database_binder& db, const float & val) {
409421 int hresult;
410422 if ((hresult = sqlite3_bind_double (db._stmt .get (), db._inx , double (val))) != SQLITE_OK) {
411423 exceptions::throw_sqlite_error (hresult);
@@ -414,7 +426,7 @@ namespace sqlite {
414426 ++db._inx ;
415427 return db;
416428 }
417- template <> inline void get_col_from_db (database_binder& db, int inx, float & f) {
429+ inline void get_col_from_db (database_binder& db, int inx, float & f) {
418430 if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
419431 f = 0 ;
420432 } else {
@@ -423,7 +435,7 @@ namespace sqlite {
423435 }
424436
425437 // double
426- template <> inline database_binder& operator <<(database_binder& db, const double & val) {
438+ inline database_binder& operator <<(database_binder& db, const double & val) {
427439 int hresult;
428440 if ((hresult = sqlite3_bind_double (db._stmt .get (), db._inx , val)) != SQLITE_OK) {
429441 exceptions::throw_sqlite_error (hresult);
@@ -432,7 +444,7 @@ namespace sqlite {
432444 ++db._inx ;
433445 return db;
434446 }
435- template <> inline void get_col_from_db (database_binder& db, int inx, double & d) {
447+ inline void get_col_from_db (database_binder& db, int inx, double & d) {
436448 if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
437449 d = 0 ;
438450 } else {
@@ -491,7 +503,7 @@ namespace sqlite {
491503 }
492504
493505 // std::string
494- template <> inline void get_col_from_db (database_binder& db, int inx, std::string & s) {
506+ inline void get_col_from_db (database_binder& db, int inx, std::string & s) {
495507 if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
496508 s = std::string ();
497509 } else {
@@ -504,7 +516,7 @@ namespace sqlite {
504516 template <std::size_t N> inline database_binder& operator <<(database_binder& db, const char (&STR)[N]) { return db << std::string (STR); }
505517 template <std::size_t N> inline database_binder& operator <<(database_binder& db, const char16_t (&STR)[N]) { return db << std::u16string (STR); }
506518
507- template <> inline database_binder& operator <<(database_binder& db, const std::string& txt) {
519+ inline database_binder& operator <<(database_binder& db, const std::string& txt) {
508520 int hresult;
509521 if ((hresult = sqlite3_bind_text (db._stmt .get (), db._inx , txt.data (), -1 , SQLITE_TRANSIENT)) != SQLITE_OK) {
510522 exceptions::throw_sqlite_error (hresult);
@@ -514,7 +526,7 @@ namespace sqlite {
514526 return db;
515527 }
516528 // std::u16string
517- template <> inline void get_col_from_db (database_binder& db, int inx, std::u16string & w) {
529+ inline void get_col_from_db (database_binder& db, int inx, std::u16string & w) {
518530 if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
519531 w = std::u16string ();
520532 } else {
@@ -524,7 +536,7 @@ namespace sqlite {
524536 }
525537
526538
527- template <> inline database_binder& operator <<(database_binder& db, const std::u16string& txt) {
539+ inline database_binder& operator <<(database_binder& db, const std::u16string& txt) {
528540 int hresult;
529541 if ((hresult = sqlite3_bind_text16 (db._stmt .get (), db._inx , txt.data (), -1 , SQLITE_TRANSIENT)) != SQLITE_OK) {
530542 exceptions::throw_sqlite_error (hresult);
0 commit comments