[英]How to detect a type type alias?
我可以使用以下模板檢查來檢測成員:
template <typename T, typename = void>
struct hasMember : std::false_type {};
template <typename T>
struct hasMember<T, decltype((void)T::member, void())> : std::true_type {};
例如:
class Test{
public:
int member;
using sometype = size_t;
}
我可以:
if constexpr(hasMember<Test>)
{
//do something
}
現在假設我需要一個constexpr if
來告訴我 class 是否有 using 定義。 即可以檢測到某些 class (例如test
)具有某種類型的使用定義的東西。 即類似的東西
if constexpr(hasSomeType<Test>)
{
//do something
}
這可能在 c++17 中嗎? 如何?
您可以使用與數據成員檢測相同的方法來做到這一點。 而不是使用數據成員,只需使用成員類型和void_t
:
template <typename T, typename = void>
struct hasSomeType : std::false_type {};
template <typename T>
struct hasSomeType<T, std::void_t<typename T::member_type>> : std::true_type {};
或者,您可以使用檢測成語:
template<typename T>
using member_type_t = typename T::member_type;
您可以使用decltype
將任何表達式放在那里。
然后,使用別名執行檢測:
if constexpr (is_detected<member_type_t, Test>) {
// ...
}
當然,在 C++20 中,所有這些都變成了一個襯里:
// requires a type
if constexpr (requires(Test) { typename Test::member_type; }) {
}
// requires a member
if constexpr (requires(Test t) { t.member; }) {
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.