我有以下情況
template<typename Class>
concept has_member = requires (Class t)
{
// How can I write only either of the following conditions be satisfied?
{t.isInterface() }->std::same_as<bool>;
// or
{t.canInterface() }->std::same_as<bool>;
// or
// ... more conditions!
};
struct A {
bool isInterface() const { return true; }
};
struct B {
bool canInterface() const { return true; }
};
void foo(const has_member auto& A_or_B)
{
// do something
}
int main() {
foo(A{}); // should work
foo(B{}); // should work
}
就像我在評論中提到的那樣,我想在邏輯上或要求(在一個單一的concepts),以便類 A 和 B 可以傳遞給 doSomething()。
據我所知,當前的概念是檢查所有要求,這意味著邏輯和。如果我把它分解成不同的概念,一切都會奏效,但我需要撰寫更多的概念來滿足意圖。
可以合二為一嗎?類似偽代碼的東西
template<typename Class>
concept has_member = requires (Class t)
{
{t.isInterface() }->std::same_as<bool> || {t.canInterface() }->std::same_as<bool>;
// ...
};
uj5u.com熱心網友回復:
任何時候你想開始構建概念,你都應該從使用點開始。也就是說,您將出于某種目的使用一些模板引數的地方。
這意味著,您從foo. 這個界面如何foo“做某事”?不能這么簡單:
void foo(const has_member auto& A_or_B)
{
A_or_B.isInterface();
}
這將是某些has_member物件的編譯錯誤。所以你需要這樣做:
void foo(const has_member auto& A_or_B)
{
if constexpr(<stuff>)
A_or_B.isInterface();
else
A_or_B.hasInterface();
}
在哪里<stuff>進行一些編譯時條件檢查以查看物件具有哪個實際介面。您可以拼出該requires子句,但這會不必要地冗長。因此,只需將它們放在一個概念中:
template<typename T>
concept has_is_interface = requires (Class t)
{
{t.isInterface() }->std::same_as<bool>;
};
template<typename T>
concept has_can_interface = requires (Class t)
{
{t.canInterface() }->std::same_as<bool>;
};
現在,你的問題自己回答了:
template<typename Class>
concept has_member =
(has_is_interface || has_can_interface) &&
requires (Class t)
{
// ... more conditions!
};
話雖如此,這種設計通常是錯誤的。原因是它在使用時會很冗長。
您可能想要的是有一些可以呼叫適當成員介面的免費函式:
bool do_is_interface(has_is_interface auto const& is_if)
{
return is_if.is_interface();
}
bool do_is_interface(has_can_interface auto const& is_if)
{
return is_if.can_interface();
}
然后你的概念看起來像:
template<typename Class>
concept has_member =
requires (Class t)
{
{ do_is_interface(t) } -> std::same_as<bool>
// ... more conditions!
};
uj5u.com熱心網友回復:
有沒有可能合二為一?
對的,這是可能的。你可以寫出兩個的合requires取如下:
template<typename Class>
concept has_member =
requires (Class t) { {t.isInterface() }->std::same_as<bool>; }
|| //---> like this
requires (Class t) { {t.canInterface() }->std::same_as<bool>;};
// ... more conditions!
演示
uj5u.com熱心網友回復:
您可以使用從標準中竊取的以下概念形式
#include <concepts>
template<typename Class>
concept has_member = requires (Class t) {
requires (requires { { t.isInterface() } -> std::same_as<bool>; } ||
requires { { t.canInterface() } -> std::same_as<bool>; }
// add more functions
);
};
這允許我們直接在 -requires子句中添加不同的成員函式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/519908.html
標籤:C 模板c 20
下一篇:模板扣除依賴于另一個模板扣除
