クラステンプレートの特殊化でコードの重複を回避する方法

B0rk4

以下のコードの重複を避けたいと思います。

#include <iostream>

struct Bar{};

template <class... Args>
struct FooClass;

template <class... Args>
inline void foo(Args&&... args) {
  FooClass<Args...>::impl(std::forward<Args>(args)...);
}

// Duplicate 1.
// Const ref version
template <>
struct FooClass<Bar const&> {
  inline static void impl(const Bar& b) {
    std::cout << "dup1" << std::endl;
  }
};

// Duplicate 2.
// Copy version
template <>
struct FooClass<Bar> {
  inline static void impl(const Bar& b) {
    std::cout << "dup2" << std::endl;
  }
};

// Duplicate 3.
// Non-const ref version
template <>
struct FooClass<Bar&> {
  inline static void impl(const Bar& b) {
    std::cout << "dup3" << std::endl;
  }
};

int main()
{
  const Bar b2;
  foo(b2);  
  foo(Bar{});
  Bar b;
  foo(b);
}

どういうわけか、enable_ifとユニバーサル参照を使用してこれが可能であると確信していますが、理解できませんでした。

ところで、このプログラムは以下を出力します:

dup1
dup2
dup3

3つの専門分野のいずれかがコメントアウトされている場合はコンパイルされません。

平均

理由だけ取り除くないconst&テンプレート引数から?

template<class... Args>
void foo(Args&&... args) {
    FooClass<std::decay_t<Args>...>::impl(std::forward<Args>(args)...);
    //       ^^^^^^^^^^^^
}

template<>
struct FooClass<Bar> {
    static void impl(const Bar&) {
        std::cout << "bar" << std::endl;
    }
};

int main() {
    const Bar b2;
    foo(b2);       // prints "bar"
    foo(Bar{});    // prints "bar"
    Bar b;
    foo(b);        // prints "bar"
}

デモ

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

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

分類Dev

C ++-テンプレートクラスの特殊化に一般的なテンプレートのコードを含める方法はありますか?

分類Dev

特定のタイプのテンプレートクラスメソッドを特殊化する方法は?

分類Dev

テンプレート化されたオーバーライド関数の特殊化/オブジェクトのスライスを回避する

分類Dev

別のクラステンプレート内で完全に特殊化されたクラスのコンストラクターを定義する方法

分類Dev

テンプレート クラス内のメソッドを特殊化する適切な方法

分類Dev

doubleでテンプレートクラスを特殊化する方法は?

分類Dev

整数型自体で整数型のクラステンプレートを特殊化する方法は?

分類Dev

別のクラスをクラステンプレートの特殊化として使用する方法

分類Dev

テンプレート化されたクラスのメンバー構造体を特殊化する方法

分類Dev

テンプレート化されたクラスのメンバー構造体を特殊化する方法

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

ベクトルのクラステンプレートを特殊化する方法は?

分類Dev

クラス外で特殊化テンプレートメソッドを宣言する方法は?

分類Dev

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

分類Dev

特殊化による個別の宣言と定義を持つテンプレートクラスのメソッドでstd :: enable_ifを使用する方法

分類Dev

クラステンプレートの内部クラステンプレートでテンプレートを特殊化する

分類Dev

エイリアステンプレートの部分的な特殊化を回避するためのベストプラクティス

分類Dev

テンプレートサブクラスを特殊化する方法は?

分類Dev

複数のタイプのクラステンプレートの特殊化

分類Dev

「部分的特殊化で推論できないテンプレートパラメータ」を回避する方法

分類Dev

クラスがテンプレートの特殊化であるかどうかを確認します

分類Dev

クラスがテンプレートの特殊化であるかどうかを確認しますか?

分類Dev

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

分類Dev

テンプレートの特殊化でconstchar **を使用する

分類Dev

クラステンプレートの特殊化で「期待される '>'」?

分類Dev

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

Related 関連記事

  1. 1

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

  2. 2

    C ++-テンプレートクラスの特殊化に一般的なテンプレートのコードを含める方法はありますか?

  3. 3

    特定のタイプのテンプレートクラスメソッドを特殊化する方法は?

  4. 4

    テンプレート化されたオーバーライド関数の特殊化/オブジェクトのスライスを回避する

  5. 5

    別のクラステンプレート内で完全に特殊化されたクラスのコンストラクターを定義する方法

  6. 6

    テンプレート クラス内のメソッドを特殊化する適切な方法

  7. 7

    doubleでテンプレートクラスを特殊化する方法は?

  8. 8

    整数型自体で整数型のクラステンプレートを特殊化する方法は?

  9. 9

    別のクラスをクラステンプレートの特殊化として使用する方法

  10. 10

    テンプレート化されたクラスのメンバー構造体を特殊化する方法

  11. 11

    テンプレート化されたクラスのメンバー構造体を特殊化する方法

  12. 12

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

  13. 13

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

  14. 14

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

  15. 15

    ベクトルのクラステンプレートを特殊化する方法は?

  16. 16

    クラス外で特殊化テンプレートメソッドを宣言する方法は?

  17. 17

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

  18. 18

    特殊化による個別の宣言と定義を持つテンプレートクラスのメソッドでstd :: enable_ifを使用する方法

  19. 19

    クラステンプレートの内部クラステンプレートでテンプレートを特殊化する

  20. 20

    エイリアステンプレートの部分的な特殊化を回避するためのベストプラクティス

  21. 21

    テンプレートサブクラスを特殊化する方法は?

  22. 22

    複数のタイプのクラステンプレートの特殊化

  23. 23

    「部分的特殊化で推論できないテンプレートパラメータ」を回避する方法

  24. 24

    クラスがテンプレートの特殊化であるかどうかを確認します

  25. 25

    クラスがテンプレートの特殊化であるかどうかを確認しますか?

  26. 26

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

  27. 27

    テンプレートの特殊化でconstchar **を使用する

  28. 28

    クラステンプレートの特殊化で「期待される '>'」?

  29. 29

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

ホットタグ

アーカイブ