// boost_test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <boost/smart_ptr.hpp>
#include <boost/bind.hpp>
#include <boost/function.hpp>
class CTest
{
public:
virtual void TestShow()
{
std::cout << __FUNCTION__ << std::endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
typedef boost::function<void()> TVoidEvent;
std::vector<TVoidEvent> vVoidEvent;
for (int i = 0; i < 9; ++i)
{
boost::shared_ptr<CTest> spTest = boost::make_shared<CTest>();
boost::weak_ptr<CTest> wpTest(spTest);
//TVoidEvent voidEvent = boost::bind(
// [/*wpTest*/]()
// {
// //boost::shared_ptr<CTest> spTestTem = wpTest.lock();
// //if(spTestTem)
// //{
// // spTestTem->TestShow();
// //}
// std::cout << __FUNCTION__ << std::endl;
// }
// );
//TVoidEvent voidEvent = [spTest]
// {
// if (spTest)
// {
// spTest->TestShow();
// }
// };
// bind配合weak_ptr使用
//TVoidEvent voidEvent = [wpTest]
//{
// boost::shared_ptr<CTest> spTem = wpTest.lock();
// if (spTem)
// {
// spTem->TestShow();
// }
//};
// 直接把lambda和bind一起用编译有问题
TVoidEvent voidEvent = boost::bind(
[wpTest]
{
boost::shared_ptr<CTest> spTem = wpTest.lock();
if (spTem)
{
spTem->TestShow();
}
}
);
vVoidEvent.push_back(voidEvent);
}
std::for_each(vVoidEvent.begin(), vVoidEvent.end(),
[](TVoidEvent& voidEvent)
{
voidEvent();
});
return 0;
}
上面能过,下面就过不了,,,模板V5
[]{std::cout << __FUNCTION__ << std::endl;}();
boost::bind([]{std::cout << __FUNCTION__ << std::endl;});