ホームページ >バックエンド開発 >C++ >Java の `extends` キーワードのように C でテンプレートの型を制限するにはどうすればよいですか?

Java の `extends` キーワードのように C でテンプレートの型を制限するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-20 11:39:101035ブラウズ

How Can I Restrict Template Types in C   Like Java's `extends` Keyword?

C でのテンプレート型の制約

Java では、指定された基本クラスを拡張する型のみを受け入れるようにジェネリック クラスを制限できます。キーワードを拡張します。この目的のために C に同様のキーワードはありますか?

C に相当する

C には、テンプレート制約に対する Java の extends キーワードに直接相当するものはありません。ただし、C 11 は、同様の効果を達成するための代替メカニズムを提供します。

型特性を使用した C 11 のアプローチ

C 11 では、std::is_base_of 特性を使用できます。 からヘッダーを使用して、型が別の型から派生したかどうかを確認します。以下に例を示します。

#include <type_traits>

template<typename T>
class observable_list {
    static_assert(std::is_base_of<list, T>::value, "T must inherit from list");

    // ...
};

この例では、リスト クラスから継承する型のみを受け入れる observable_list テンプレート クラスを定義します。ただし、過度に制約のあるテンプレートは柔軟性を制限する可能性があり、C では理想的ではない可能性があることに注意することが重要です。

代替アプローチ: 特性ベースの制約

代替アプローチ特定の要件に基づいてタイプを制限するカスタム特性を作成することが含まれます。たとえば、特定のメンバー関数または typedef を使用して型の特性を定義できます。

struct has_const_iterator {
    template<typename T>
    static bool test(...) { return false; }
};

template<typename T>
struct has_const_iterator<T, Void<typename T::const_iterator>> {
    static bool test(...) { return true; }
};

struct has_begin_end {
    template<typename T>
    static bool test(...) { return false; }

    template<typename T, typename Begin, typename End>
    static auto test(int) -> decltype(std::declval<const T&>().begin(), std::declval<const T&>().end()) { return true; }
};

これらの特性を使用すると、次のように observable_list を制約できます。

class observable_list {
    static_assert(has_const_iterator<T>::value, "Must have a const_iterator typedef");
    static_assert(has_begin_end<T>::value, "Must have begin and end member functions");

    // ...
};

このアプローチでは、より優れた機能が提供されます。要件に基づいて特定の制約を定義できるため、柔軟性とエラーのフィードバックが向上します。

以上がJava の `extends` キーワードのように C でテンプレートの型を制限するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。