Capturing struct member pointer

ORM을 구현하기 위해선 struct의 member type, 정확히는 member type의 pointer를 저장할 수 있어야 한다. 아래는 template을 이용하여 struct의 member pointer를 저장하도록 구현한 예제이다.

#include <iostream>

namespace type {

template<class O, class F>
struct Object {
	typedef F O::*Field;
	Field field;
};

template<class O, class T>
Object<O, T> capture(T O::*m) {
	return {m};
}

} // namespace type

struct Data {
	int i;
	bool b;
	std::string s;
};

int main() {
	auto c1 = type::capture(&Data::i);
	auto c2 = type::capture(&Data::b);
	auto c3 = type::capture(&Data::s);

	if (c1.field == &Data::i)
		std::cout << "[int] member captured." << '\n';

	if (c2.field == &Data::b)
		std::cout << "[bool] member captured." << '\n';

	if (c3.field == &Data::s)
		std::cout << "[string] member captured." << '\n';

	return 0;
}