본문 바로가기
프로그래밍/boost

boost::function / boost::tuple 의 활용

by neive 2012. 11. 7.
728x90



function callback map 을 만들고 거기에 tuple 을 이용한 변수의 적용을 하는 예제를 만들어 보았습니다
제가 실제 활용한 것은 어떤 패킷에 대한 콜백 처리와 서버 접속자에 대한 send 처리에 활용을 했지요
여기에 템플릿까지 잘 적용하면 더 멋진 모습이 되지만 일단 본 내용에서 전달하고자 하는 취지와는 안맞으니 생략 합니다 :)


예제 소스


#include "stdafx.h"

#include <map>
#include <boost/asio.hpp>		// 본 예제와는 관계 없음, 다만 BYTE 정의 때문에 추가
#include <boost/shared_ptr.hpp>
#include <boost/function.hpp>
#include <boost/tuple/tuple.hpp>


class CTestMng
{
	typedef boost::function<void (boost::tuple<int, BYTE*>)>	TYPE_CNT_CB;

	std::map<int, TYPE_CNT_CB> m_CallbackMap;	// 유저 id 와 send 콜백 맵, 아이디를 알면 메세지를 보낼 수 있다

public:

	void Add(const int nID, const TYPE_CNT_CB cb)
	{
		m_CallbackMap.insert(std::map<int, TYPE_CNT_CB>::value_type(nID, cb));
	}

	void Do(int nID, int nSize, BYTE* pData) const 
	{
		std::map<int, TYPE_CNT_CB>::const_iterator it = m_CallbackMap.find(nID);
		if(it != m_CallbackMap.end())
			(it->second)(boost::make_tuple(nSize, pData));
	}
};

class CTest
{
public:

	void TestCallbackFunction(boost::tuple<int, BYTE*> val)
	{
		std::cout << "run : TestCallbackFunction " << std::endl;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	boost::shared_ptr<CTest> pTest(new CTest);

	// 매니저에 0번 아이디와 콜백 추가
	CTestMng test;
	test.Add(0, std::bind1st(std::mem_fun(&CTest::TestCallbackFunction), pTest.get()));

	// 0 번 아이디의 콜백 실행
	test.Do(0, 0, NULL);

	int n;
	std::cin >> n;

	return 0;
}

728x90

'프로그래밍 > boost' 카테고리의 다른 글

boost::ptr_unordered_map  (0) 2013.05.24
boost::program_options  (0) 2012.11.16
boost::tuple / tuples / tuples::tuple  (0) 2012.11.06
boost::shared_ptr 과 Virtual Function 과 boost::timer  (0) 2012.10.25
boost::random  (0) 2012.10.24

댓글