C ++プライマー第5版関数テンプレートの特殊化

マエストロ

こんにちは私はC ++プライマー第5版からこのコードを持っています:

主な機能テンプレート:

// first version; can compare any two types
template <typename T>
int compare(T const& x, T const& y)
{
    std::cout << "compare(T const&, T const&)\n";

    if(std::less<T>()(x, y))
        return -1;
    if(std::less<T>()(y, x))
        return 1;
    return 0;
}

文字配列の特殊化:

// second version to handle string literals
template <unsigned N, unsigned M>
int compare(char const(&ar1)[N], char const(&ar2)[M])
{
    std::cout << "compare(char const(&)[N], char const(&)[M])\n";
    return strcmp(ar1, ar2);
}


// special version of compare to handle pointers to character arrays
template <>
int compare(const char* const &p1, const char* const &p2)
{
    std::cout << "compare(char const* const&, char const* const&)\n";

    return strcmp(p1, p2);
}


int main()
{

    const char *p1 = "hi", *p2 = "mom";
    compare(p1, p2); // calls the third version (pointers to character strings)
    compare("hi", "mom"); // calls the template with two nontype parameters
    compare("high", "HIGH"); // error: call ambiguous

    std::cout << "\nDone!\n";
}
  • いくつか質問があります:

  • バージョンであるcompare配列パラメータを参照してspecializationoverloadそのパラメータリストはプライマリ関数テンプレートの1つと一致する必要があるため、これは特殊化だと思いますcompare正しいですか?

  • プログラムは、2つの文字配列または同じ長さの2つのリテラル文字列を渡すまで正常に機能します。その場合、コンパイラは私の呼び出しのように呼び出しを解決できませんcompare("high", "HIGH");

これは、配列パラメーターを含むバージョンが実行可能でないために失敗することを意味しますか?-配列のサイズはその型の一部であると推測するため、異なるサイズの2つの配列を渡すと、2つの異なる型が生成されるため、このバージョンは実行可能ではありませんか?

私のコンパイラの出力:

    error: call of overloaded ‘compare(const char [5], const char [5])’ is ambiguous
     candidate: ‘int compare(const T&, const T&) [with T = char [5]]’|
    candidate: ‘int compare(const char (&)[N], const char (&)[M]) [with unsigned int N = 5; unsigned int M = 5]’
  • では、どうすればこの呼び出しを明確にすることができますか?私の推測について教えてください。ありがとう
ディートマークール

最初の質問に関して:関数はオーバーロードであり、特殊化ではありません最初に関数テンプレートを部分的に特殊化する方法はありません。それを超えて、専門分野は空のテンプレートパラメータリストに言及するでしょう。たとえば、のバージョンchar const*は特殊化されています。

template <>
int compare(char const* x, char const& *);

2番目の質問に関して:コンパイラーは、最初のオーバーロードと2番目のオーバーロードが同等に優れているという結論に達したようです。配列参照を取得するバージョンの方が優れているように見えるので、なぜそうなるのかよくわかりません。別のオーバーロードを追加すると、その問題が解決します。

template <unsigned N>
int compare(char const(&ar1)[N], char const(&ar2)[N])
{   
    std::cout << "compare(char const(&)[N], char const(&)[N])\n";
    return strcmp(ar1, ar2);
}

2つの配列サイズのバージョンも実行可能です。他の過負荷も良いというだけです。オーバーロードを追加する代わりに、最初のバージョンを制約して、配列に使用できないようにすることができます。

template <typename T>
std::enable_if_t<!std::is_array_v<T>, int> compare(T const& x, T const& y)
{
    std::cout << "compare(T const&, T const&)\n";

    if(std::less<T>()(x, y))
        return -1;
    if(std::less<T>()(y, x))
        return 1;
    return 0;
}

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

C ++プライマー第5版 関数テンプレートのオーバーロード

分類Dev

C ++:配列の関数テンプレートの特殊化

分類Dev

関数テンプレートc ++の明示的な特殊化

分類Dev

C ++ 11のパフォーマンス:ラムダインライン化と関数テンプレートの特殊化

分類Dev

C ++ Primer 5thEdition第16.5章クラステンプレートの特殊化

分類Dev

C ++テンプレート特殊化メンバー関数の定義

分類Dev

C ++テンプレートの特殊化と関数の戻り値

分類Dev

C ++テンプレートの特殊化と関数の戻り値

分類Dev

C ++ポインターテンプレートの特殊化

分類Dev

C ++エラーC2893:関数テンプレートの特殊化に失敗しました

分類Dev

C ++クラステンプレートの特殊化

分類Dev

エラーC2893:関数テンプレートVC ++ 2012の特殊化に失敗しました

分類Dev

C ++ 11での複数のテンプレートパラメータを使用したテンプレート関数の特殊化

分類Dev

C ++でのテンプレートの特殊化と関数のオーバーロード

分類Dev

c ++複数パラメーターテンプレートクラスメンバーの特殊化

分類Dev

クラスエラー内のC ++テンプレートの特殊化

分類Dev

C ++コンストラクターテンプレートの特殊化

分類Dev

エラーC2893:CTPLで関数テンプレートを特殊化できませんでした

分類Dev

C ++ 20概念テンプレート関数の特殊化を使用する場合の依存関係

分類Dev

c ++テンプレート特殊化パラメーターの複製

分類Dev

複数のパラメーターに対するC ++部分クラステンプレートの特殊化

分類Dev

C ++コード生成とテンプレートの特殊化

分類Dev

C ++でのテンプレート特殊化の文字列引数

分類Dev

C ++部分的なテンプレートの特殊化の混乱

分類Dev

Visual C ++でテンプレートの特殊化を使用する場合のコンパイラエラー

分類Dev

C ++関数テンプレートの特殊化はどのように機能しますか?

分類Dev

C ++-可変個引数テンプレートの部分的な特殊化

分類Dev

C ++可変個引数テンプレートメソッドの特殊化

分類Dev

C ++テンプレートの特殊化を防ぐ方法は?

Related 関連記事

  1. 1

    C ++プライマー第5版 関数テンプレートのオーバーロード

  2. 2

    C ++:配列の関数テンプレートの特殊化

  3. 3

    関数テンプレートc ++の明示的な特殊化

  4. 4

    C ++ 11のパフォーマンス:ラムダインライン化と関数テンプレートの特殊化

  5. 5

    C ++ Primer 5thEdition第16.5章クラステンプレートの特殊化

  6. 6

    C ++テンプレート特殊化メンバー関数の定義

  7. 7

    C ++テンプレートの特殊化と関数の戻り値

  8. 8

    C ++テンプレートの特殊化と関数の戻り値

  9. 9

    C ++ポインターテンプレートの特殊化

  10. 10

    C ++エラーC2893:関数テンプレートの特殊化に失敗しました

  11. 11

    C ++クラステンプレートの特殊化

  12. 12

    エラーC2893:関数テンプレートVC ++ 2012の特殊化に失敗しました

  13. 13

    C ++ 11での複数のテンプレートパラメータを使用したテンプレート関数の特殊化

  14. 14

    C ++でのテンプレートの特殊化と関数のオーバーロード

  15. 15

    c ++複数パラメーターテンプレートクラスメンバーの特殊化

  16. 16

    クラスエラー内のC ++テンプレートの特殊化

  17. 17

    C ++コンストラクターテンプレートの特殊化

  18. 18

    エラーC2893:CTPLで関数テンプレートを特殊化できませんでした

  19. 19

    C ++ 20概念テンプレート関数の特殊化を使用する場合の依存関係

  20. 20

    c ++テンプレート特殊化パラメーターの複製

  21. 21

    複数のパラメーターに対するC ++部分クラステンプレートの特殊化

  22. 22

    C ++コード生成とテンプレートの特殊化

  23. 23

    C ++でのテンプレート特殊化の文字列引数

  24. 24

    C ++部分的なテンプレートの特殊化の混乱

  25. 25

    Visual C ++でテンプレートの特殊化を使用する場合のコンパイラエラー

  26. 26

    C ++関数テンプレートの特殊化はどのように機能しますか?

  27. 27

    C ++-可変個引数テンプレートの部分的な特殊化

  28. 28

    C ++可変個引数テンプレートメソッドの特殊化

  29. 29

    C ++テンプレートの特殊化を防ぐ方法は?

ホットタグ

アーカイブ