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 サイトの他の関連記事を参照してください。