2017-08-09 173 views
2

我想檢查類型T是否也是參數包Ts的一部分。在C++ 14中有這樣做的solutions,但是如果這可以在C++ 17中簡化,我就會遊蕩。如果在Ts中找不到T,則應停止編譯器(static_assertion應該失敗)。檢查模板類型T是否屬於C++中的變量參數包17

template<typename... Ts> 
class A 
{ 
    template<typename T> 
    void action() { 
    // check that T is also in Ts (static_assertion) 
    } 
} 
+0

您鏈接到該解決方案是5號線長。你在尋找多少簡化? – Sneftel

+1

我的問題[here](https://stackoverflow.com/questions/45578484/is-it-possible-to-get-the-first-type-of-a-parameter-pack-in-a-one-liner/45578533#45578533)有四條工作路線,答案只有一條。你在這裏找到的解決方案是製作一個包中某些類型的vector元素的元組長度超過10行。它現在可以在一個。 – dani

+0

@Sneftel,你走了。需要一行代碼。 – dani

回答

5

我聽到摺疊表達式是新的辣味:

static_assert((std::is_same_v<T, Ts> || ...)); 
+1

inc(vote)for「hotness」:D – Columbo

0

很容易在C++與摺疊式:

template<typename... Ts> 
class A 
{ 
    template<typename T> 
    void action() { 
    static_assert((... || std::is_same_v<T, Ts>)), "Not!") 
    } 
} 
4

如果你喜歡一個庫特點:

static_assert(std::disjunction_v<std::is_same<T, Ts>...>); 

請注意,這會執行shor (這裏可能不是非常有益,但需要牢記)。摺疊表達式是同樣可行:

static_assert((std::is_same_v<T, Ts> || ...)); 

(從@Barry被盜。)

相關問題