首頁 > 後端開發 > C++ > 如何像 Java 的「extends」關鍵字一樣限制 C 中的範本類型?

如何像 Java 的「extends」關鍵字一樣限制 C 中的範本類型?

DDD
發布: 2024-12-20 11:39:10
原創
1037 人瀏覽過

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_of 特徵來自 header 來檢查一個類型是否派生自另一個類型。以下是一個範例:

#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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板