Lý lịch
Chúng tôi biết rằng khái niệm std::same_asnày là bất khả tri theo thứ tự (nói cách khác, đối xứng): std::same_as<T, U>tương đương với std::same_as<U, T>( câu hỏi liên quan ). Trong câu hỏi này, tôi muốn thực hiện một cái gì đó tổng quát hơn: template <typename ... Types> concept same_are = ...kiểm tra xem các loại trong gói Typescó bằng nhau không.
Nỗ lực của tôi
#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;
}
(Ý định của tôi ở đây là liệt kê mọi cặp loại có thể có trong gói)
Thật không may, mã này sẽ không được biên dịch , với trình biên dịch phàn nàn rằng cuộc gọi đến foo(int, int)không rõ ràng. Tôi tin rằng nó xem xét are_same<U, T>và are_same<T, U>như không tương đương. Tôi muốn biết tại sao mã bị lỗi làm thế nào tôi có thể sửa nó (để trình biên dịch coi chúng là tương đương)?
... Typesđều giống nhau? Có lẽ std :: kết hợp có thể giúp bạn. Có một ví dụ ở dưới cùng của trang trông giống với cách tiếp cận của bạn.
same_with_otherstrong mọi hoán vị có thể có của các loại.