@@ -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+ // Overload instead of specializing function templates (http://www.gotw.ca/publications/mill17.htm)
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
@@ -370,15 +383,15 @@ namespace sqlite {
370383 };
371384
372385 // int
373- template <> inline database_binder& operator <<(database_binder& db, const int & val) {
386+ inline database_binder& operator <<(database_binder& db, const int & val) {
374387 int hresult;
375388 if ((hresult = sqlite3_bind_int (db._stmt .get (), db._inx , val)) != SQLITE_OK) {
376389 exceptions::throw_sqlite_error (hresult);
377390 }
378391 ++db._inx ;
379392 return db;
380393 }
381- template <> inline void get_col_from_db (database_binder& db, int inx, int & val) {
394+ inline void get_col_from_db (database_binder& db, int inx, int & val) {
382395 if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
383396 val = 0 ;
384397 } else {
@@ -387,7 +400,7 @@ namespace sqlite {
387400 }
388401
389402 // sqlite_int64
390- template <> inline database_binder& operator <<(database_binder& db, const sqlite_int64& val) {
403+ inline database_binder& operator <<(database_binder& db, const sqlite_int64& val) {
391404 int hresult;
392405 if ((hresult = sqlite3_bind_int64 (db._stmt .get (), db._inx , val)) != SQLITE_OK) {
393406 exceptions::throw_sqlite_error (hresult);
@@ -396,7 +409,7 @@ namespace sqlite {
396409 ++db._inx ;
397410 return db;
398411 }
399- template <> inline void get_col_from_db (database_binder& db, int inx, sqlite3_int64& i) {
412+ inline void get_col_from_db (database_binder& db, int inx, sqlite3_int64& i) {
400413 if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
401414 i = 0 ;
402415 } else {
@@ -405,7 +418,7 @@ namespace sqlite {
405418 }
406419
407420 // float
408- template <> inline database_binder& operator <<(database_binder& db, const float & val) {
421+ inline database_binder& operator <<(database_binder& db, const float & val) {
409422 int hresult;
410423 if ((hresult = sqlite3_bind_double (db._stmt .get (), db._inx , double (val))) != SQLITE_OK) {
411424 exceptions::throw_sqlite_error (hresult);
@@ -414,7 +427,7 @@ namespace sqlite {
414427 ++db._inx ;
415428 return db;
416429 }
417- template <> inline void get_col_from_db (database_binder& db, int inx, float & f) {
430+ inline void get_col_from_db (database_binder& db, int inx, float & f) {
418431 if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
419432 f = 0 ;
420433 } else {
@@ -423,7 +436,7 @@ namespace sqlite {
423436 }
424437
425438 // double
426- template <> inline database_binder& operator <<(database_binder& db, const double & val) {
439+ inline database_binder& operator <<(database_binder& db, const double & val) {
427440 int hresult;
428441 if ((hresult = sqlite3_bind_double (db._stmt .get (), db._inx , val)) != SQLITE_OK) {
429442 exceptions::throw_sqlite_error (hresult);
@@ -432,7 +445,7 @@ namespace sqlite {
432445 ++db._inx ;
433446 return db;
434447 }
435- template <> inline void get_col_from_db (database_binder& db, int inx, double & d) {
448+ inline void get_col_from_db (database_binder& db, int inx, double & d) {
436449 if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
437450 d = 0 ;
438451 } else {
@@ -491,7 +504,7 @@ namespace sqlite {
491504 }
492505
493506 // std::string
494- template <> inline void get_col_from_db (database_binder& db, int inx, std::string & s) {
507+ inline void get_col_from_db (database_binder& db, int inx, std::string & s) {
495508 if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
496509 s = std::string ();
497510 } else {
@@ -504,7 +517,7 @@ namespace sqlite {
504517 template <std::size_t N> inline database_binder& operator <<(database_binder& db, const char (&STR)[N]) { return db << std::string (STR); }
505518 template <std::size_t N> inline database_binder& operator <<(database_binder& db, const char16_t (&STR)[N]) { return db << std::u16string (STR); }
506519
507- template <> inline database_binder& operator <<(database_binder& db, const std::string& txt) {
520+ inline database_binder& operator <<(database_binder& db, const std::string& txt) {
508521 int hresult;
509522 if ((hresult = sqlite3_bind_text (db._stmt .get (), db._inx , txt.data (), -1 , SQLITE_TRANSIENT)) != SQLITE_OK) {
510523 exceptions::throw_sqlite_error (hresult);
@@ -514,7 +527,7 @@ namespace sqlite {
514527 return db;
515528 }
516529 // std::u16string
517- template <> inline void get_col_from_db (database_binder& db, int inx, std::u16string & w) {
530+ inline void get_col_from_db (database_binder& db, int inx, std::u16string & w) {
518531 if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
519532 w = std::u16string ();
520533 } else {
@@ -524,7 +537,7 @@ namespace sqlite {
524537 }
525538
526539
527- template <> inline database_binder& operator <<(database_binder& db, const std::u16string& txt) {
540+ inline database_binder& operator <<(database_binder& db, const std::u16string& txt) {
528541 int hresult;
529542 if ((hresult = sqlite3_bind_text16 (db._stmt .get (), db._inx , txt.data (), -1 , SQLITE_TRANSIENT)) != SQLITE_OK) {
530543 exceptions::throw_sqlite_error (hresult);
0 commit comments