我想知道如何std::same_as定義以及我們如何在概念或需求中使用它。
例子:
void f1() { }
bool f2() { return true; }
template < typename T>
void Do( T func )
{
if constexpr ( requires { { func() } -> std::same_as<bool>; } )
{
std::cout << "Func returns bool " << std::endl;
}
if constexpr ( requires { { func() } -> std::same_as<void>; } )
{
std::cout << "Func returns void " << std::endl;
}
}
int main()
{
Do( f1 );
Do( f2 );
}
這按預期作業。
但是如果我查看std::same_as的定義,我會發現一個可能的實作:
namespace detail {
template< class T, class U >
concept SameHelper = std::is_same_v<T, U>;
}
template< class T, class U >
concept same_as = detail::SameHelper<T, U> && detail::SameHelper<U, T>;
讓我感到奇怪的是,我看到了兩個模板引數,T而U在這種情況下,我們只需要撰寫一個類似{ { func() } -> std::same_as<bool>; }.
在那種情況下a會被轉換成某種魔法嗎?{ { func() } -> std::same_as<bool>; }std::same_as<magic_return_type, bool>
uj5u.com熱心網友回復:
Aconcept通常類似于constexpr inline bool變數模板。但是,它確實具有特殊屬性。對于這個問題,concept第一個模板引數是型別的a是一種特殊的概念:“型別概念”。
在某些位置,可以在沒有第一個模板引數的情況下使用型別概念。在這些地方,第一個引數將根據它的使用方式推匯出來。
在requires運算式的復合要求中,型別概念是跟在->. 概念的第一個引數會被 中的運算式 E 的型別填充{},就像是 by 一樣decltype((E))。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/372507.html
上一篇:一個打出包含字符的板的程式
