@@ -223,6 +223,19 @@ namespace sqlite {
223
223
template <typename T> friend database_binder& operator <<(database_binder& db, const std::unique_ptr<T>& val);
224
224
template <typename T> friend void get_col_from_db (database_binder& db, int inx, std::unique_ptr<T>& val);
225
225
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);
226
239
227
240
228
241
#ifdef _MODERN_SQLITE_BOOST_OPTIONAL_SUPPORT
@@ -370,15 +383,15 @@ namespace sqlite {
370
383
};
371
384
372
385
// int
373
- template <> inline database_binder& operator <<(database_binder& db, const int & val) {
386
+ inline database_binder& operator <<(database_binder& db, const int & val) {
374
387
int hresult;
375
388
if ((hresult = sqlite3_bind_int (db._stmt .get (), db._inx , val)) != SQLITE_OK) {
376
389
exceptions::throw_sqlite_error (hresult);
377
390
}
378
391
++db._inx ;
379
392
return db;
380
393
}
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) {
382
395
if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
383
396
val = 0 ;
384
397
} else {
@@ -387,7 +400,7 @@ namespace sqlite {
387
400
}
388
401
389
402
// 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) {
391
404
int hresult;
392
405
if ((hresult = sqlite3_bind_int64 (db._stmt .get (), db._inx , val)) != SQLITE_OK) {
393
406
exceptions::throw_sqlite_error (hresult);
@@ -396,7 +409,7 @@ namespace sqlite {
396
409
++db._inx ;
397
410
return db;
398
411
}
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) {
400
413
if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
401
414
i = 0 ;
402
415
} else {
@@ -405,7 +418,7 @@ namespace sqlite {
405
418
}
406
419
407
420
// float
408
- template <> inline database_binder& operator <<(database_binder& db, const float & val) {
421
+ inline database_binder& operator <<(database_binder& db, const float & val) {
409
422
int hresult;
410
423
if ((hresult = sqlite3_bind_double (db._stmt .get (), db._inx , double (val))) != SQLITE_OK) {
411
424
exceptions::throw_sqlite_error (hresult);
@@ -414,7 +427,7 @@ namespace sqlite {
414
427
++db._inx ;
415
428
return db;
416
429
}
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) {
418
431
if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
419
432
f = 0 ;
420
433
} else {
@@ -423,7 +436,7 @@ namespace sqlite {
423
436
}
424
437
425
438
// double
426
- template <> inline database_binder& operator <<(database_binder& db, const double & val) {
439
+ inline database_binder& operator <<(database_binder& db, const double & val) {
427
440
int hresult;
428
441
if ((hresult = sqlite3_bind_double (db._stmt .get (), db._inx , val)) != SQLITE_OK) {
429
442
exceptions::throw_sqlite_error (hresult);
@@ -432,7 +445,7 @@ namespace sqlite {
432
445
++db._inx ;
433
446
return db;
434
447
}
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) {
436
449
if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
437
450
d = 0 ;
438
451
} else {
@@ -491,7 +504,7 @@ namespace sqlite {
491
504
}
492
505
493
506
// 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) {
495
508
if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
496
509
s = std::string ();
497
510
} else {
@@ -504,7 +517,7 @@ namespace sqlite {
504
517
template <std::size_t N> inline database_binder& operator <<(database_binder& db, const char (&STR)[N]) { return db << std::string (STR); }
505
518
template <std::size_t N> inline database_binder& operator <<(database_binder& db, const char16_t (&STR)[N]) { return db << std::u16string (STR); }
506
519
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) {
508
521
int hresult;
509
522
if ((hresult = sqlite3_bind_text (db._stmt .get (), db._inx , txt.data (), -1 , SQLITE_TRANSIENT)) != SQLITE_OK) {
510
523
exceptions::throw_sqlite_error (hresult);
@@ -514,7 +527,7 @@ namespace sqlite {
514
527
return db;
515
528
}
516
529
// 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) {
518
531
if (sqlite3_column_type (db._stmt .get (), inx) == SQLITE_NULL) {
519
532
w = std::u16string ();
520
533
} else {
@@ -524,7 +537,7 @@ namespace sqlite {
524
537
}
525
538
526
539
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) {
528
541
int hresult;
529
542
if ((hresult = sqlite3_bind_text16 (db._stmt .get (), db._inx , txt.data (), -1 , SQLITE_TRANSIENT)) != SQLITE_OK) {
530
543
exceptions::throw_sqlite_error (hresult);
0 commit comments