バックグラウンド
概念std::same_as
は順序にとらわれない(つまり、対称)ことを知っています。std::same_as<T, U>
これは、std::same_as<U, T>
(関連する質問)と同等です。この質問では、より一般的なものを実装したいと思います。それはtemplate <typename ... Types> concept same_are = ...
、パック内の型Types
が互いに等しいかどうかをチェックします。
私の試み
#include <type_traits>
#include <iostream>
#include <concepts>
template <typename T, typename... Others>
concept same_with_others = (... && std::same_as<T, Others>);
template <typename... Types>
concept are_same = (... && same_with_others<Types, Types...>);
template< class T, class U> requires are_same<T, U>
void foo(T a, U b) {
std::cout << "Not integral" << std::endl;
}
// Note the order <U, T> is intentional
template< class T, class U> requires (are_same<U, T> && std::integral<T>)
void foo(T a, U b) {
std::cout << "Integral" << std::endl;
}
int main() {
foo(1, 2);
return 0;
}
(ここでの私の意図は、パックで注文されたすべての可能なタイプのペアを列挙することです)
残念ながら、このコードはコンパイルできず、コンパイラーfoo(int, int)
はへの呼び出しがあいまいであると不平を言っています。私はそれが同等are_same<U, T>
でare_same<T, U>
はないと見なしていると信じています。コードがなぜ失敗するかを知りたいのですが、どうすれば修正できるのですか(コンパイラーがそれらを同等のものとして扱うため)?
... Types
が同じかどうかを確認しますか?多分std :: conjunctionがあなたを助けるでしょう。ページの下部に、あなたのアプローチに似ている例があります。
same_with_others
、型の可能なすべての順列で実行されるヘルパーが必要だと私に言っています。