クラステンプレートによって演算子関数タイプを特殊化するにはどうすればよいですか?

jaj16839

次のようなクラスがあり、クラステンプレートTによって '->'演算子を特殊化したいと思います。特殊化は、型Tがポインタ型であるかどうかによって異なります。私は解決策を探しましたが、この特定の問題については何も見つかりませんでした。

template <typename T>
class C
{
public:
    // when T is a pointer type
    T operator->()
    {
        return value;
    }

    // when T is not a pointer type
    const T* operator->() const
    {
        return &value;
    }

private:
    T value;
};

void test()
{
    struct Test
    {
        int x, y;
    };

    C<Test> c1;
    C<Test*> c2;

    c1->x = 5; // should both work
    c2->x = 5; // ignoring the fact, that c2's value is undefined
}

助けてくれてありがとう!

アパルパラ

あなたは必要な部分特殊化をし、また、あなたはポインタを逆参照して注意する必要があります。元の例はクラッシュする可能性があります。

template <typename T>
class C
{
public:
    explicit C(const T& v = T()): value(v) {}
    // when T is not a pointer type
    T* operator->()
    {
        return &value;
    }

private:
    T value;
};

template <typename T>
class C<T*>
{
public:
    explicit C(T* v = nullptr): value(v) {}
    // when T is a pointer type
    T* operator->()
    {
        return value;
    }

private:
    T* value;
};

または、C ++ 17互換のコンパイラを使用している場合は、if constexpr:を使用できます

template <typename T>
class C
{
public:
    explicit C(const T& v = T()): value(v) {}
    // when T is not a pointer type
    auto operator->()
    {
        if constexpr (std::is_pointer_v<T>)
            return value;
        else
            return &value;
    }

private:
    T value;
};

それをテストするには:

int main()
{
    struct Test
    {
        int x, y;
    };

    C<Test> c1({1, 2});
    Test t = {3, 4};
    C<Test*> c2(&t); // Initialize the pointer with some valid address, we are going to dereference it!

    c1->x = 5;
    c2->x = 5;
    std::cout << c1->x << ' ' << c1->y << ' ' << t.x << ' ' << t.y << '\n';
}

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

既存のテンプレートクラスを新しいタイプに部分的に特殊化するにはどうすればよいですか?

分類Dev

同じテンプレート関数で複数のタイプを特殊化するにはどうすればよいですか?

分類Dev

関数テンプレートの特殊化を減らすにはどうすればよいですか?

分類Dev

クラステンプレートの非型パラメータを部分的に特殊化するにはどうすればよいですか?

分類Dev

クラステンプレートの特殊化を使用してエイリアステンプレートの特殊化を作成するにはどうすればよいですか?

分類Dev

テンプレート化されたクラスの基本クラスに基づいてメンバー関数を特殊化するにはどうすればよいですか

分類Dev

関数テンプレートを「部分的に特殊化」できるように調整するにはどうすればよいですか?

分類Dev

完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

分類Dev

完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

分類Dev

STLコンテナであるテンプレートパラメータに基づいて、選択したメンバー関数の部分的な特殊化をシミュレートするにはどうすればよいですか?

分類Dev

std :: string用にテンプレートを特殊化するにはどうすればよいですか

分類Dev

列挙値のクラステンプレートを部分的に特殊化するにはどうすればよいですか?

分類Dev

C ++「新しい」タイプのテンプレートを特殊化するときに、コンストラクターパラメーターを事前定義するにはどうすればよいですか。

分類Dev

部分的なクラステンプレートの特殊化で継承を実装するにはどうすればよいですか?

分類Dev

インスタンス化されている場合、テンプレート化された変数の特殊化をコンパイル時に失敗させるにはどうすればよいですか?

分類Dev

関数型インターフェースのストレート宣言で型を特殊化するにはどうすればよいですか?

分類Dev

テンプレート化されていないクラスのテンプレート化されたメンバーメソッドを部分的に特殊化するにはどうすればよいですか?

分類Dev

異なるタイプを返すように設計されたテンプレート関数をどのように特殊化できますか?

分類Dev

関数テンプレートの部分的な特殊化を回避するにはどうすればよいですか?

分類Dev

C ++が完全な特殊化によってマスクされている基本テンプレート関数をインスタンス化するのはなぜですか?

分類Dev

STLソートを使用して、テンプレートの特殊化を使用してカスタムクラスオブジェクトをソートするにはどうすればよいですか?

分類Dev

C ++ 11では、戻り値の型に基づいて関数オブジェクトを受け取る関数テンプレートを特殊化するにはどうすればよいですか?

分類Dev

クラスを特殊化する場合、異なる数のテンプレートパラメータを取得するにはどうすればよいですか?

分類Dev

メンバーパラメータへのポインタを持つテンプレートクラスを特殊化するにはどうすればよいですか?

分類Dev

関数テンプレート(クラステンプレートのメンバー)を明示的に特殊化すると、「部分的な特殊化は許可されていません」というエラーが発生します。なぜですか?

分類Dev

関数テンプレートを部分的に特殊化する代わりに、どうすればよいですか?

分類Dev

プライマリテンプレートをあいまいにすることなく、is_base_ofを使用してテンプレートを特殊化するにはどうすればよいですか?

分類Dev

標準ライブラリ演算子と競合することなく、関連するクラスのグループの演算子をテンプレートオーバーロードするにはどうすればよいですか?

分類Dev

可変個引数を使用してこのテンプレートの特殊化をクラスの友達にするにはどうすればよいですか?

Related 関連記事

  1. 1

    既存のテンプレートクラスを新しいタイプに部分的に特殊化するにはどうすればよいですか?

  2. 2

    同じテンプレート関数で複数のタイプを特殊化するにはどうすればよいですか?

  3. 3

    関数テンプレートの特殊化を減らすにはどうすればよいですか?

  4. 4

    クラステンプレートの非型パラメータを部分的に特殊化するにはどうすればよいですか?

  5. 5

    クラステンプレートの特殊化を使用してエイリアステンプレートの特殊化を作成するにはどうすればよいですか?

  6. 6

    テンプレート化されたクラスの基本クラスに基づいてメンバー関数を特殊化するにはどうすればよいですか

  7. 7

    関数テンプレートを「部分的に特殊化」できるように調整するにはどうすればよいですか?

  8. 8

    完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

  9. 9

    完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

  10. 10

    STLコンテナであるテンプレートパラメータに基づいて、選択したメンバー関数の部分的な特殊化をシミュレートするにはどうすればよいですか?

  11. 11

    std :: string用にテンプレートを特殊化するにはどうすればよいですか

  12. 12

    列挙値のクラステンプレートを部分的に特殊化するにはどうすればよいですか?

  13. 13

    C ++「新しい」タイプのテンプレートを特殊化するときに、コンストラクターパラメーターを事前定義するにはどうすればよいですか。

  14. 14

    部分的なクラステンプレートの特殊化で継承を実装するにはどうすればよいですか?

  15. 15

    インスタンス化されている場合、テンプレート化された変数の特殊化をコンパイル時に失敗させるにはどうすればよいですか?

  16. 16

    関数型インターフェースのストレート宣言で型を特殊化するにはどうすればよいですか?

  17. 17

    テンプレート化されていないクラスのテンプレート化されたメンバーメソッドを部分的に特殊化するにはどうすればよいですか?

  18. 18

    異なるタイプを返すように設計されたテンプレート関数をどのように特殊化できますか?

  19. 19

    関数テンプレートの部分的な特殊化を回避するにはどうすればよいですか?

  20. 20

    C ++が完全な特殊化によってマスクされている基本テンプレート関数をインスタンス化するのはなぜですか?

  21. 21

    STLソートを使用して、テンプレートの特殊化を使用してカスタムクラスオブジェクトをソートするにはどうすればよいですか?

  22. 22

    C ++ 11では、戻り値の型に基づいて関数オブジェクトを受け取る関数テンプレートを特殊化するにはどうすればよいですか?

  23. 23

    クラスを特殊化する場合、異なる数のテンプレートパラメータを取得するにはどうすればよいですか?

  24. 24

    メンバーパラメータへのポインタを持つテンプレートクラスを特殊化するにはどうすればよいですか?

  25. 25

    関数テンプレート(クラステンプレートのメンバー)を明示的に特殊化すると、「部分的な特殊化は許可されていません」というエラーが発生します。なぜですか?

  26. 26

    関数テンプレートを部分的に特殊化する代わりに、どうすればよいですか?

  27. 27

    プライマリテンプレートをあいまいにすることなく、is_base_ofを使用してテンプレートを特殊化するにはどうすればよいですか?

  28. 28

    標準ライブラリ演算子と競合することなく、関連するクラスのグループの演算子をテンプレートオーバーロードするにはどうすればよいですか?

  29. 29

    可変個引数を使用してこのテンプレートの特殊化をクラスの友達にするにはどうすればよいですか?

ホットタグ

アーカイブ