派生クラスによるc ++テンプレートの特殊化

ony_pox232:

派生クラスを受け付けるようにクラスのテンプレートメソッドを特殊化しようとすると問題が発生します。私もポインタを試してみましたが、この反復よりも多くの問題が発生します。

#include <iostream>

using namespace std;

class Json {
  public:
    Json(){}
    virtual ~Json(){}
    template <class T>
    bool Get(std::string key, T& value);
};

template <class T>
bool Json::Get(std::string key, T& value){
    std::cout << "Call default GET" << std::endl;
}

template <>
bool Json::Get(std::string key, Json& value){
    std::cout << "Call JSON GET" << std::endl;
}

class JsonError : public Json {
    public:
        JsonError(){}
        ~JsonError(){}
};

int main()
{
    // OK
    int int_value = 0;
    Json json;
    json.Get("int", int_value);
    
    // OK
    Json json_value;
    json.Get("json", json_value);
    
    // NOT OK
    JsonError json_error_value;
    json.Get("error", json_error_value);
    
    return 0;
}

これは印刷する必要があります

Call default GET                                                                                                                                            
Call JSON GET                                                                                                                                               
Call JSON GET  
素晴らしい :

それはテンプレートが機能する方法ではありません。テンプレートの控除は常に正確なタイプ(この場合JsonError)に基づいているため、の特殊化Json&は一致しません。

それでも機能させたい場合は、メンバー関数がを使用してテンプレート関数をオーバーロードできますJson&テンプレート関数は引き続き派生型に適しています。そのため、から派生するすべての型のテンプレートメソッドを無効にする必要もありJsonます。

#include <iostream>

class Json {
  public:
    Json(){}
    virtual ~Json(){}
    template <class T, std::enable_if_t<!std::is_base_of_v<Json, T>, int> = 0>
    bool Get(std::string key, T& value);

    bool Get(std::string key, Json& value);
};

template <class T, std::enable_if_t<!std::is_base_of_v<Json, T>, int> = 0>
bool Json::Get(std::string key, T& value){
    std::cout << "Call default GET" << std::endl;
    return true;
}

bool Json::Get(std::string key, Json& value){
    std::cout << "Call JSON GET" << std::endl;
    return true;
}

class JsonError : public Json {
    public:
        JsonError(){}
        ~JsonError(){}
};

int main()
{
    // OK
    int int_value = 0;
    Json json;
    json.Get("int", int_value);
    
    // OK
    Json json_value;
    json.Get("json", json_value);
    
    // NOW IT'S OK
    JsonError json_error_value;
    json.Get("error", json_error_value);
    
    return 0;
}

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

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

分類Dev

内部クラスのテンプレートの特殊化

分類Dev

クラスと関数テンプレートの特殊化

分類Dev

テンプレートクラスの部分特殊化構文

分類Dev

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

分類Dev

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

分類Dev

std :: enable_if <>によるテンプレートの特殊化

分類Dev

enable_ifによるテンプレートの特殊化

分類Dev

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

分類Dev

C ++テンプレートの特殊化/部分的および完全

分類Dev

C ++テンプレートの特殊化char *およびValgrind

分類Dev

部分的なテンプレートの特殊化エラー

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

テンプレートの特殊化に関する問題

分類Dev

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

分類Dev

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

分類Dev

C ++部分テンプレートの特殊化とNatvis

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

constを参照するテンプレートの特殊化

分類Dev

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

分類Dev

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

分類Dev

C ++部分テンプレートテンプレートの特殊化

分類Dev

フレンドクラスの部分的なテンプレートの特殊化?

分類Dev

SFINAEおよび部分クラステンプレートの特殊化

Related 関連記事

  1. 1

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

  2. 2

    内部クラスのテンプレートの特殊化

  3. 3

    クラスと関数テンプレートの特殊化

  4. 4

    テンプレートクラスの部分特殊化構文

  5. 5

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

  6. 6

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

  7. 7

    std :: enable_if <>によるテンプレートの特殊化

  8. 8

    enable_ifによるテンプレートの特殊化

  9. 9

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

  10. 10

    C ++テンプレートの特殊化/部分的および完全

  11. 11

    C ++テンプレートの特殊化char *およびValgrind

  12. 12

    部分的なテンプレートの特殊化エラー

  13. 13

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

  14. 14

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

  15. 15

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

  16. 16

    テンプレートの特殊化に関する問題

  17. 17

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

  18. 18

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

  19. 19

    C ++部分テンプレートの特殊化とNatvis

  20. 20

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

  21. 21

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

  22. 22

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

  23. 23

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

  24. 24

    constを参照するテンプレートの特殊化

  25. 25

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

  26. 26

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

  27. 27

    C ++部分テンプレートテンプレートの特殊化

  28. 28

    フレンドクラスの部分的なテンプレートの特殊化?

  29. 29

    SFINAEおよび部分クラステンプレートの特殊化

ホットタグ

アーカイブ