2017-08-09 3 views
2
私はタイプ Tもパラメータパック Tsの一部であることを確認したい

。 C++ 14ではこれを行うsolutionsがありますが、これをC++ 17で単純化できれば私は迷っています。 がTsに見つからない場合、コンパイラは停止する必要があります(static_assertionは失敗するはずです)。私は折りたたみ式の表現を聞くテンプレート型Tがでvaradicパラメータパックの一部であることを確認する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

私の質問(https://stackoverflow.com/questions/45578484/is-it-possible-to-get-the-first-type-of-a-parameter-pack-in-a-one-liner/45578533#45578533)には4つの作業ラインがあり、回答には1つのみが含まれていました。パック内のいくつかの型の 'ベクトル 'の'タプル(tuple)'を作るためにここで見つけた解決策は、10行を超えています。それは今では1つの可能性があります。 – dani

+0

@Sneftel、そこに行きます。 1ライナー。 – dani

答えて

5

は、新たな辛さです。

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

inc(投票)「暑さ」: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>...>); 

これはショア(おそらくここではあまり有益ではないが、留意すべきことがある)。 (@Barryから盗まれた。)

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

関連する問題