#include <iostream>
#include <algorithm>
using namespace std;

template< typename Base, typename... T >
struct Comparer
{
	template< T Base::* ... ptr >
	struct Members 
	{
		static bool compare( Base const& lhs, Base const& rhs )
		{
			bool arr[]{ ( lhs.*ptr == rhs.*ptr )... };
			return all_of( begin(arr), end(arr), [](bool b){return b;} );
		}
	};
};

template< typename T > struct get_type;
template< typename Type, typename Class > 
struct get_type<Type Class::*>
{
	using type = Type;
	using class_type = Class;
};

template<typename...> struct type_list;

template<typename ... Args>
type_list<Args...> get_types( Args... );

template<typename> struct create_comparer;
template< typename First, typename ... Tail >
struct create_comparer<type_list<First, Tail...>> :  
	Comparer<typename get_type<First>::class_type, 
             typename get_type<First>::type,
             typename get_type<Tail>::type...> {};

#define CREATE_COMPARER(...) create_comparer<decltype(get_types(__VA_ARGS__))>::Members<__VA_ARGS__>

struct A
{
	int a;
	char b;
};

int main() 
{
	A a{4, '7'}, b=a, c{5, '7'};
	cout << CREATE_COMPARER(&A::a, &A::b)::compare(a, b);
	cout << CREATE_COMPARER(&A::a, &A::b)::compare(a, c);
}