簡體   English   中英

c++ 概念如何結合概念?

[英]how can a c++ concept combine concepts?

我繼承了以下內容:

template <typename T>
concept IsAwaiter = requires {
  typename T::await_ready;
  typename T::await_suspend;
  typename T::await_resume;
};

template <typename ...AWAITABLES>
concept IsAwaitables = typename std::conjunction<IsAwaiter<AWAITABLES>...>::type;

使用 clang 10.0.0 構建它會導致以下錯誤:

IsAwaiter.h:43:50: error: template argument for template type parameter must be a type

也許只是一個簡單的語法問題,但我發現很難找到一個示例來展示如何基於可變參數模板概念參數創建概念。

任何幫助表示贊賞!

std::conjunction用於類型特征。 std::conjunction<IsAwaiter<AWAITABLES>...>是一個具有成員static bool value = (IsAwaiter<AWAITABLES>::value && ...) ,其中每個IsAwaiter<AWAITABLES>本身應該是一個類型具有自己的static bool成員value trait。 IsAwaiter<AWAITABLES>是一個概念時,這是無意義的,因為概念不是類型特征。 他們“只是”布爾值。 使用折疊表達式。

template <typename... AWAITABLES>
concept IsAwaitables = (IsAwaiter<AWAITABLES> && ...);

就是這樣。

struct Dummy {
    using await_ready = Dummy;
    using await_suspend = Dummy;
    using await_resume = Dummy;
};

int main() {
    static_assert(IsAwaitables<>);
    static_assert(IsAwaitables<Dummy>);
    static_assert(IsAwaitables<Dummy, Dummy>);
}

正如HTNW 指出的,你想要:

template <typename ...T>
concept IsAwaitables =  (IsAwaiter<T> && ...);

但真的,你甚至需要這個概念嗎? 您可以直接使用IsAwaiter 它可能應該只命名為Awaiter - 概念的典型約定是將它們命名為名詞而不是問題(例如RangeIsRange )。

如果您正在使用參數包,您無論如何都想使用它:

template <Awaiter... T>
void f(T... awaiters);

與縮寫的函數模板語法相同:

void f(Awaiter auto... awaiters);

或者如果你有固定數量的它們,那尤其沒有意義:

template <Awaiter T, Awaiter U>
void f(T, U);

即使在它不完全適合的其他上下文中,手動使用帶有折疊表達式的Awaiter似乎更好。 所以我質疑連詞概念的必要性。

暫無
暫無

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

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