#include <iostream>
#include <utility>



template<typename T>
constexpr const T& mirror(const T& t)
{
	return t;
}

template<class A, class B>
constexpr auto mirror(const std::pair<A, B>& p)
{
	return std::make_pair(mirror(p.second), mirror(p.first));
}

int main() {
	constexpr std::pair<int, float> a{42, 4.2f};
	
	static_assert(std::make_pair(4.2f, 42) == mirror(a), "unexpected");
	
	constexpr std::pair<int, std::pair<float, char>> b{0, {4.2f, '*'}};
	
	static_assert(std::make_pair(std::make_pair('*', 4.2f), 0) == mirror(b), "unexpected");
}