簡體   English   中英

是否可以(以及如何)為C ++模板功能參數添加類型協定檢查?

[英]is it possible (and how) to add a type contract check for C++ template function parameter?

例如,我想實現自己的通用排序功能,我希望將傳入的類型設置為Indexable ,並且其中的元素應該是Comparable

template <typename Cont>
    **type_check: Cont is Indexable, Cont::Element is Comparable**
void my_sort(Cont& cont){
    // do sorting work
}

當我做my_sort(vector<int>{1,6,5,4})會沒事的

但是my_sort(linkedlist<int>{1,6,5,4})會使我在編譯/運行時失敗,因為linkedlist不可Indexable

那么有沒有辦法進行這種類型的合同編程呢?

PS我在C ++ 11環境中,但是也歡迎使用更高版本的C ++中的任何解決方案

使用SFINAE,您可以執行以下操作:

template <typename Cont>
auto my_sort(Cont& cont)
-> decltype(cont[42], // Indexable
            void(), // That void to avoid evil overload of operator comma
            std::declval<Cont::Element>() < std::declval<Cont::Element>(), // Comparable
            void()) // That final void for the return type of sort
{
    // do sorting work
}

如果您已准備好特征,則std::enable_if是替代decltype

如評論中所述,一旦Concepts TS進入C ++標准,您將可以通過以下方式實現此目的:

template <typename T>
concept Sortable = requires(T t) {
    { t[0] < t[0] } -> bool
};

template <Sortable Cont>
my_sort(Cont& cont) {
    // do sorting work
}

現場演示

GCC使用-fconcepts標志實現了較舊版本的Concepts TS,但直到C ++ 20才成為標准。 在此之前,您可以使用SFINAE技巧:

template <typename Cont>
std::enable_if_t<std::is_convertible_v<decltype(std::declval<Cont>()[0] < std::declval<Cont>()[0]), bool>>
my_sort(Cont& cont) {
    // ...
}

如果對於給定的Cont cc[0] < c[0]無效或不可轉換為bool ,則將無法編譯。
現場演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM