Lý lịch
Chúng tôi biết rằng khái niệm std::same_as
nà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 Types
có 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_others
trong mọi hoán vị có thể có của các loại.