2015-12-05 12 views
5

新しいC++ 1z構文を使用していると聞いたことがありますが、バリデージックテンプレートのパラメータパックで型が渡されたかどうかを確認するのは本当に簡単です。このコードは1行に近いコードです。これは本当ですか?これらの関連機能は何ですか?バリデーショナルテンプレートのパラメータパックで型が渡されているかどうかをチェック

を(私は...折り畳み式のを見たが、私はその問題にそれらを使用する方法を見ることができません試してみました)ここで私は参考のためにC++ 11で問題を解決した方法は次のとおりです。

#include <type_traits> 


template<typename T, typename ...Ts> 
struct contains; 

template<typename T> 
struct contains<T> { 
    static constexpr bool value = false; 
}; 

template<typename T1, typename T2, typename ...Ts> 
struct contains<T1, T2, Ts...> { 
    static constexpr bool value = std::is_same<T1, T2>::value ? true : contains<T1, Ts...>::value; 
}; 
+1

これまでの折りたたみ式の構文を理解できないと言った部分が表示されませんでした。 – Praetorian

答えて

13

あなたはstd::disjunctionを探しています。 N4564[meta.logical]で指定されています。

#include <type_traits> 

template<typename T, typename... Ts> 
constexpr bool contains() 
{ return std::disjunction_v<std::is_same<T, Ts>...>; } 

static_assert( contains<int,  bool, char, int, long>()); 
static_assert( contains<bool,  bool, char, int, long>()); 
static_assert( contains<long,  bool, char, int, long>()); 
static_assert(not contains<unsigned, bool, char, int, long>()); 

Live demo


あるいは、struct

template<typename T, typename... Ts> 
struct contains : std::disjunction<std::is_same<T, Ts>...> 
{}; 

あるいは、表現

template<typename T, typename... Ts> 
struct contains : std::bool_constant<(std::is_same<T, Ts>{} || ...)> 
{}; 
を折る使用に適応

Live demo

+0

いいです!私は通常、継承によって委譲されたバリューメタ機能を見ています。かなり短くなっています。テンプレート<...>構造体には:std :: disjunction <...> {}; ' – Quentin

+0

@Quentinありがとうございます。 – Praetorian

+0

折り畳まれた式の中で、 'structは以下を含みます:std :: bool_constant {} || ...)>'構文は何ですか? 'std :: is_same {}'はどういう意味ですか? (つまり、 'std :: is_same 'は 'value'メンバ変数に真偽値を含む構造体です。どのような構文規則で' {} '構造体からこの' value 'を抽出しますか?) – qiubit

関連する問題