同じテンプレート関数で複数のタイプを特殊化するにはどうすればよいですか?

grorel

データベースから列を読み取る汎用関数があります。ヘッダーファイルのプロトタイプは次のとおりです。

template <typename T> void sqlite3_column_template(sqlite3_stmt *stmt, int column, T& value);

アイデアは、値のタイプに応じてこれらの関数を呼び出すようにこの関数を特殊化することです。

sqlite3_column_int64(...)
sqlite3_column_double(...)
sqlite3_column_text(...)

私のcppファイルには、次のような特殊化関数を記述しています。

template <> void sqlite3_column_template(sqlite3_stmt *stmt, int column, int& value)
{
    value = sqlite3_column_int64(stmt, column);
}

template <> void sqlite3_column_template(sqlite3_stmt *stmt, int column, float& value)
{
    value = sqlite3_column_double(stmt, column);
}

template <> void sqlite3_column_template(sqlite3_stmt *stmt, int column, std::string& value)
{
    value = reinterpret_cast<const char*>(sqlite3_column_text(stmt, column));
}

私が抱えている問題は、この関数を呼び出すときの値の型が次のようになる可能性があることです。

uint32_t, int32_t, int64_t
float, double

すべての「整数」型が関数を呼び出さなければならないことを伝える方法がわかりませんsqlite3_column_int64

同じfloatdoubleのコールにsqlite3_column_double機能。

どうすればいいですか?それは可能ですか?


編集

私が使用する解決策は次のとおりです。

// the 3 functions in the header file
template <typename T> 
std::enable_if_t<std::is_integral_v<T>> sqlite3_column_template(sqlite3_stmt *stmt, int column, T& value)
{
    value = sqlite3_column_int64(stmt, column);
}

template <typename T> 
std::enable_if_t<std::is_floating_point_v<T>> sqlite3_column_template(sqlite3_stmt *stmt, int column, T& value)
{
    value = sqlite3_column_double(stmt, column);
}

template <typename T> 
std::enable_if_t<std::is_same_v<T, std::string>> sqlite3_column_template(sqlite3_stmt *stmt, int column, T& value)
{
    value = reinterpret_cast<const char*>(sqlite3_column_text(stmt, column));
}
フロガット

SFINAEstd::enable_ifを使用して、型特性に基づいて過負荷解決から関数を条件付きで削除するために使用できます

enable_ifを使用した後のコード:

template <typename T> 
std::enable_if_t<std::is_integral_v<T>> sqlite3_column_template(sqlite3_stmt *stmt, int column, T& value)
{
    value = sqlite3_column_int64(stmt, column);
}

template <typename T> 
std::enable_if_t<std::is_floating_point_v<T>> sqlite3_column_template(sqlite3_stmt *stmt, int column, T& value)
{
    value = sqlite3_column_double(stmt, column);
}

void sqlite3_column_template(sqlite3_stmt *stmt, int column, std::string& value)
{
    value = reinterpret_cast<const char*>(sqlite3_column_text(stmt, column));
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

関数テンプレートの特殊化を減らすにはどうすればよいですか?

分類Dev

クラステンプレートによって演算子関数タイプを特殊化するにはどうすればよいですか?

分類Dev

関数テンプレートを「部分的に特殊化」できるように調整するにはどうすればよいですか?

分類Dev

関数テンプレートの部分的な特殊化を回避するにはどうすればよいですか?

分類Dev

異なるタイプを返すように設計されたテンプレート関数をどのように特殊化できますか?

分類Dev

関数型インターフェースのストレート宣言で型を特殊化するにはどうすればよいですか?

分類Dev

完全に特殊化されたテンプレート関数は通常の関数と同じですか?

分類Dev

既存のテンプレートクラスを新しいタイプに部分的に特殊化するにはどうすればよいですか?

分類Dev

STLコンテナであるテンプレートパラメータに基づいて、選択したメンバー関数の部分的な特殊化をシミュレートするにはどうすればよいですか?

分類Dev

typename引数のないテンプレートを特殊化するにはどうすればよいですか?

分類Dev

std :: string用にテンプレートを特殊化するにはどうすればよいですか

分類Dev

インスタンス化されている場合、テンプレート化された変数の特殊化をコンパイル時に失敗させるにはどうすればよいですか?

分類Dev

関数テンプレートを部分的に特殊化する代わりに、どうすればよいですか?

分類Dev

完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

分類Dev

完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

分類Dev

C ++ 11では、戻り値の型に基づいて関数オブジェクトを受け取る関数テンプレートを特殊化するにはどうすればよいですか?

分類Dev

.cppファイルでテンプレートメンバー関数の明示的な特殊化を定義するにはどうすればよいですか?

分類Dev

type_traitsまたはテンプレート関数の特殊化を使用してテンプレートメソッドを統合するにはどうすればよいですか

分類Dev

テンプレート関数のエイリアスとインスタンス化を同時に行うにはどうすればよいですか?

分類Dev

クラステンプレートの非型パラメータを部分的に特殊化するにはどうすればよいですか?

分類Dev

テンプレート化されたクラスの基本クラスに基づいてメンバー関数を特殊化するにはどうすればよいですか

分類Dev

Cythonの2つのタイプにC ++でテンプレート化された関数を使用するにはどうすればよいですか?

分類Dev

C ++の複数のクラスタイプに同じテンプレートメンバー関数を指定するにはどうすればよいですか?

分類Dev

クラステンプレートの特殊化を使用してエイリアステンプレートの特殊化を作成するにはどうすればよいですか?

分類Dev

異なる特殊なテンプレートクラスを同じメンバー変数に格納するにはどうすればよいですか?

分類Dev

メンバー関数テンプレートのインスタンス化を削除するにはどうすればよいですか?

分類Dev

クラスを特殊化する場合、異なる数のテンプレートパラメータを取得するにはどうすればよいですか?

分類Dev

EFCore-同じタイプに複数のナビゲーションプロパティを設定するにはどうすればよいですか?

分類Dev

C ++「新しい」タイプのテンプレートを特殊化するときに、コンストラクターパラメーターを事前定義するにはどうすればよいですか。

Related 関連記事

  1. 1

    関数テンプレートの特殊化を減らすにはどうすればよいですか?

  2. 2

    クラステンプレートによって演算子関数タイプを特殊化するにはどうすればよいですか?

  3. 3

    関数テンプレートを「部分的に特殊化」できるように調整するにはどうすればよいですか?

  4. 4

    関数テンプレートの部分的な特殊化を回避するにはどうすればよいですか?

  5. 5

    異なるタイプを返すように設計されたテンプレート関数をどのように特殊化できますか?

  6. 6

    関数型インターフェースのストレート宣言で型を特殊化するにはどうすればよいですか?

  7. 7

    完全に特殊化されたテンプレート関数は通常の関数と同じですか?

  8. 8

    既存のテンプレートクラスを新しいタイプに部分的に特殊化するにはどうすればよいですか?

  9. 9

    STLコンテナであるテンプレートパラメータに基づいて、選択したメンバー関数の部分的な特殊化をシミュレートするにはどうすればよいですか?

  10. 10

    typename引数のないテンプレートを特殊化するにはどうすればよいですか?

  11. 11

    std :: string用にテンプレートを特殊化するにはどうすればよいですか

  12. 12

    インスタンス化されている場合、テンプレート化された変数の特殊化をコンパイル時に失敗させるにはどうすればよいですか?

  13. 13

    関数テンプレートを部分的に特殊化する代わりに、どうすればよいですか?

  14. 14

    完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

  15. 15

    完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

  16. 16

    C ++ 11では、戻り値の型に基づいて関数オブジェクトを受け取る関数テンプレートを特殊化するにはどうすればよいですか?

  17. 17

    .cppファイルでテンプレートメンバー関数の明示的な特殊化を定義するにはどうすればよいですか?

  18. 18

    type_traitsまたはテンプレート関数の特殊化を使用してテンプレートメソッドを統合するにはどうすればよいですか

  19. 19

    テンプレート関数のエイリアスとインスタンス化を同時に行うにはどうすればよいですか?

  20. 20

    クラステンプレートの非型パラメータを部分的に特殊化するにはどうすればよいですか?

  21. 21

    テンプレート化されたクラスの基本クラスに基づいてメンバー関数を特殊化するにはどうすればよいですか

  22. 22

    Cythonの2つのタイプにC ++でテンプレート化された関数を使用するにはどうすればよいですか?

  23. 23

    C ++の複数のクラスタイプに同じテンプレートメンバー関数を指定するにはどうすればよいですか?

  24. 24

    クラステンプレートの特殊化を使用してエイリアステンプレートの特殊化を作成するにはどうすればよいですか?

  25. 25

    異なる特殊なテンプレートクラスを同じメンバー変数に格納するにはどうすればよいですか?

  26. 26

    メンバー関数テンプレートのインスタンス化を削除するにはどうすればよいですか?

  27. 27

    クラスを特殊化する場合、異なる数のテンプレートパラメータを取得するにはどうすればよいですか?

  28. 28

    EFCore-同じタイプに複数のナビゲーションプロパティを設定するにはどうすればよいですか?

  29. 29

    C ++「新しい」タイプのテンプレートを特殊化するときに、コンストラクターパラメーターを事前定義するにはどうすればよいですか。

ホットタグ

アーカイブ