簡體   English   中英

如何檢測類型類型別名?

[英]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.

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