「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 「enable_if」を使用してテンプレートパラメータに基づいてメンバー関数を選択する方法

「enable_if」を使用してテンプレートパラメータに基づいてメンバー関数を選択する方法

2024 年 11 月 6 日に公開
ブラウズ:784

How to Select a Member Function Based on a Template Parameter Using `enable_if`?

Enable_If 条件を使用したメンバー関数の選択

このタスクは、クラス テンプレート パラメーターに基づいてメンバー関数の呼び出しを決定することです。次のコード スニペットはこれを実現しようとします:

#include 
#include 

template
struct Point
{
  void MyFunction(typename std::enable_if<:is_same int>::value, T &>::type* = 0)
  {
    std::cout ::value, float &>::type* = 0)
  {
    std::cout 

ただし、このコードはコンパイルに失敗し、「'struct std::enable_if' に 'type' という名前の型がありません」というエラーが表示されます。

SFINAE in Action

この問題を理解する鍵は、置換失敗はエラーではない (SFINAE) の概念にあります。 Enable_if により、テンプレート引数に基づいた条件付きコンパイルが可能になります。この場合、テンプレート引数 T は、メンバー関数がインスタンス化されるときにすでにわかっています。したがって、インスタンス化時に条件が評価され、対応する関数が選択されます。

コードの修正

これを修正するには、ダミーのテンプレート引数を導入する必要があります。デフォルトは T です。これにより、SFINAE メカニズムが意図したとおりに動作できるようになります。変更されたコードは次のようになります:

template
struct Point
{
  template
  typename std::enable_if<:is_same int>::value>::type
    MyFunction()
  {
    std::cout 
  typename std::enable_if<:is_same float>::value>::type
    MyFunction()
  {
    std::cout 

明示的なメンバー関数の特殊化の防止

HostileFork によって指摘されているように、元のコードではメンバー関数のテンプレート引数を明示的に指定できます。間違った結果。これを防ぐために、テンプレート引数が提供されているかどうかを確認する static_assert を追加できます。これにより、テンプレート引数 T に基づいて正しいメンバー関数が常に呼び出されることになります。変更されたコードは次のようになります。

template
struct Point
{
  template
  typename std::enable_if<:is_same int>::value>::type
    MyFunction()
  {
    static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
    std::cout 
  typename std::enable_if<:is_same float>::value>::type
    MyFunction()
  {
    static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
    std::cout 
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3