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

シリコマンサー

次のC ++ 20コード(現在のGCC10でビルド)を使用していくつかのテストを行っていました。

template <typename ToT, typename FromT>
ToT myfunction(const FromT& pFrom) = delete;

template <typename ToT, typename FromT>
struct myclass
{
   inline ToT myclassmethod(const FromT& pFrom)
   {
      return myfunction<ToT, FromT>(pFrom);
   }
};

/* C++20 concepts code */
template <std::same_as<std::string> ToT, std::integral FromT>
inline ToT myfunction(const FromT& pFrom)
{
   return std::to_string(pFrom);
}

template <std::same_as<std::string> ToT, std::floating_point FromT>
inline ToT myfunction(const FromT& pFrom)
{
   return std::to_string(pFrom);
}

/* Alternative conventional code
template <>
inline std::string myfunction(const int& pFrom)
{
   return std::to_string(pFrom);
}

template <>
inline std::string myfunction(const double& pFrom)
{
   return std::to_string(pFrom);
}
*/

int main(int pArgc, char* pArgv[]) noexcept
{
   std::cout << myclass<std::string, int>().myclassmethod(10);
   std::cout << myclass<std::string, double>().myclassmethod(0.666);

   return 0;
}

従来のコードを使用すると、すべてが正常にコンパイルされます。スペシャライゼーションは必要に応じて使用されます。代わりにC ++ 20コードを使用すると、「削除された関数の使用」というエラーが発生します。

C ++ 20の概念の特殊化は、従来の特殊化と同じように機能することを期待していましたが、明らかに、そのような特殊化を個別に定義することを不可能にする違いがあります(関連する質問テンプレート関数の特殊化を使用する場合のモジュールの依存関係を参照)。

これはC ++ 20で望ましい動作ですか?C ++ 20で、概念関数テンプレートを個別にカスタマイズする方法はありますか(つまり、呼び出す前に宣言や定義なしで特殊化を定義する)?

デイビスヘリング

これらは専門分野ではありませんが、オーバーロードします。そのため、発信者の後に表示された場合、ADLによってのみ検出されます。いつものように、転送ラッパーで部分的な特殊化(この場合は制約付きのもの)を使用できます(もちろん、それはあまり面白くありませんstd::same_as。)

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

C ++ 20の概念:テンプレート引数が複数の概念に該当する場合、どのテンプレートの特殊化が選択されますか?

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

C ++で複数のベーステンプレートを使用する場合のテンプレートの特殊化

分類Dev

将来の特殊化のために、C ++テンプレート関数を戻り値の型に依存しないようにする方法

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

C ++ 20では、プログラム定義型のstdでの関数テンプレートの特殊化はできなくなりますか?

分類Dev

SFINAEを使用したC ++ 11テンプレート関数の特殊化により、さらに特殊化できます(エラー:オーバーロードされた関数の呼び出しがあいまいです)

分類Dev

可変個引数テンプレート関数をC ++で特殊化する方法は?

分類Dev

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

分類Dev

(Objective-)C ++テンプレートの特殊化に関するシンボルの重複

分類Dev

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

分類Dev

複数のC ++テンプレートの特殊化でのコードの重複を回避する

分類Dev

C ++の概念とテンプレートの特殊化。ユーザーフレンドリーなコンパイラエラーを取得する方法

分類Dev

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

分類Dev

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

分類Dev

C ++テンプレートの特殊化に基本クラスを追加する

分類Dev

C ++テンプレートの特殊化に基本クラスを追加する

分類Dev

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

分類Dev

C ++テンプレートでメンバー関数を部分的に特殊化できないのはなぜですか

分類Dev

C ++でキーワードdeleteを使用して特定のテンプレート特殊化を削除する方法

分類Dev

C ++-関数テンプレートの特殊化が呼び出されていない

分類Dev

テンプレート関数内のテンプレート関数の推定(C ++の概念を使用)

分類Dev

C ++では、テンプレート関数が部分的な特殊化を持てないのはなぜですか?

分類Dev

C ++ 11は、同じテンプレート関数のさまざまな特殊化を呼び出すテンプレート関数の構文を単純化します

Related 関連記事

  1. 1

    C ++ 20の概念:テンプレート引数が複数の概念に該当する場合、どのテンプレートの特殊化が選択されますか?

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

    C ++で複数のベーステンプレートを使用する場合のテンプレートの特殊化

  6. 6

    将来の特殊化のために、C ++テンプレート関数を戻り値の型に依存しないようにする方法

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

    C ++ 20では、プログラム定義型のstdでの関数テンプレートの特殊化はできなくなりますか?

  12. 12

    SFINAEを使用したC ++ 11テンプレート関数の特殊化により、さらに特殊化できます(エラー:オーバーロードされた関数の呼び出しがあいまいです)

  13. 13

    可変個引数テンプレート関数をC ++で特殊化する方法は?

  14. 14

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

  15. 15

    (Objective-)C ++テンプレートの特殊化に関するシンボルの重複

  16. 16

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

  17. 17

    複数のC ++テンプレートの特殊化でのコードの重複を回避する

  18. 18

    C ++の概念とテンプレートの特殊化。ユーザーフレンドリーなコンパイラエラーを取得する方法

  19. 19

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

  20. 20

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

  21. 21

    C ++テンプレートの特殊化に基本クラスを追加する

  22. 22

    C ++テンプレートの特殊化に基本クラスを追加する

  23. 23

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

  24. 24

    C ++テンプレートでメンバー関数を部分的に特殊化できないのはなぜですか

  25. 25

    C ++でキーワードdeleteを使用して特定のテンプレート特殊化を削除する方法

  26. 26

    C ++-関数テンプレートの特殊化が呼び出されていない

  27. 27

    テンプレート関数内のテンプレート関数の推定(C ++の概念を使用)

  28. 28

    C ++では、テンプレート関数が部分的な特殊化を持てないのはなぜですか?

  29. 29

    C ++ 11は、同じテンプレート関数のさまざまな特殊化を呼び出すテンプレート関数の構文を単純化します

ホットタグ

アーカイブ