渡された可変個引数型リストに重複する型がないかどうかhas_no_duplicates<...>
を評価する型特性を実装したいと考えています。std::true_type
static_assert(has_no_duplicates<int, float>{}, "");
static_assert(!has_no_duplicates<float, float>{}, "");
この質問の範囲では、多重継承を使用してそれを行いたいと仮定しましょう。
クラスが同じ型を複数回継承すると、エラーが発生します。
template<class T>
struct type { };
template<class... Ts>
struct dup_helper : type<Ts>... { };
// No errors, compiles properly.
dup_helper<int, float> ok{};
// Compile-time error:
// base class 'type<float>' specified more than once as a direct base class
dup_helper<float, float> error{};
void_t
このエラーを「検出」するために使用できたと思いましたが、 cppreference のコード サンプルに従って実際の解決策を実装できませんでした。
これは私が試したものです:
template<class, class = void>
struct is_valid
: std::false_type { };
// First try:
template<class T>
struct is_valid<T, std::void_t<decltype(T{})>>
: std::true_type { };
// Second try:
template<class T>
struct is_valid<T, std::void_t<T>>
: std::true_type { };
3 回目の試行では、 のようにテンプレート テンプレート パラメータとして取り、内部で展開dup_helper<...>
するラッパー クラスを使用して展開を遅らせてみました。dup_helper
wrapper<dup_helper, ...>
void_t
残念ながら、すべての試行で前述のエラーが発生し、常にコンパイルが妨げられました。
この種のエラーは「置換失敗」として検出できないと思いますが、確認をお願いします。
この種のエラーは実際に使用して検出することは不可能void_t
ですか? (常にコンパイルに失敗しますか?)
コンパイルを失敗させずにそれを検出する方法はありますか? (または、void_t
「多重継承のトリック」を引き続き利用する非回避策)?