Можно ли определить (неупорядоченные) пары типов в c ++ (20) таким образом, чтобы можно было найти такую пару, предоставив любой из ее членов во время компиляции?
Это тривиально для достижения либо вручную определяя две упорядоченные пары для каждой неупорядоченной пары, либо определяя полный набор пар в одном месте, например, в качестве параметров шаблона кортежа:
Определение пары (A, B) с помощью специализации:
template<>
struct find_pair<A> {
using p = std::pair<A,B>;
};
template<>
struct find_pair<B> {
using p = std::pair<A,B>;
};
Получить (A, B):
find_pair<A>::p
или
find_pair<B>::p
Определение полного набора пар с помощью variadi c шаблон:
template<typename A, typename B, typename ... X>
struct some_binary_relation : some_binary_relation<X...> {
template<>
static std::pair<A,B> p<A>();
template<>
static std::pair<A,B> p<B>();
};
using rel1 = some_relation<A,B,F,G,M,N>;
decltype(rel1::p<G>()) x //std::pair<F,G>
Преимущество подхода # 1 состоит в том, что каждое определение пары может быть сделано отдельным, но требует избыточного / раздутого синтаксиса. Подход № 2 требует, чтобы каждый тип записывался только один раз, но необходимо вручную собрать все пары в списке параметров шаблона (негибко).
Возможно ли сделать это так, чтобы определения пар могли быть разделены друг от друга, и дублирование кода в определении пары не требуется?
Конечно, никакие две отдельные пары не должны содержать один и тот же тип, и поиск несуществующих пар не должен поддерживаться.