天天看点

Boost.Any

Boost.Any
Boost.Any

Anything Goes

 1 #include <iostream>

 2 #include <string>

 3 #include <utility>

 4 #include <vector>

 5 #include "boost/any.hpp"

 6 using namespace std;

 7 

 8 class A{

 9 public:

10     void some_function(){

11         cout << "A::some_function()" << endl;

12     }

13 };

14 

15 class B{

16 public:

17     void some_function(){

18         cout << "B::some_function()" << endl;

19     }

20 };

21 

22 class C{

23 public:

24     void some_function(){

25         cout << "C::some_function()" << endl;

26     }

27 };

28 

29 void print_any(boost::any& a){

30     if(A* pA = boost::any_cast<A>(&a))

31     {

32         pA->some_function();

33     }

34     else if(B* pB = boost::any_cast<B>(&a))

35     {

36         pB->some_function();

37     }

38     else if(C* pC = boost::any_cast<C>(&a))

39     {

40         pC->some_function();

41     }

42 }

43 

44 int main(){

45     cout << "Example of using any" << endl;

46     vector<boost::any> store_anything;

47 

48     store_anything.push_back(A());

49     store_anything.push_back(B());

50     store_anything.push_back(C());

51 

52     store_anything.push_back(string("This is great!"));

53     store_anything.push_back(3);

54     store_anything.push_back(make_pair(true, 7.92));

55 

56     void print_any(boost::any& a);

57 

58     for_each(store_anything.begin(), store_anything.end(), print_any);

59 

60     cin.get();

61 }

Boost.Any
Boost.Any

shared_ptr

 3 #include <algorithm>

 5 #include "boost\any.hpp"

 6 #include "boost\shared_ptr.hpp"

 7 using namespace std;

 8 

 9 class A{

10 public:

11     virtual ~A(){

12         cout << "A::~A()" << endl;

13     }

15     void not_virtual()

16     {

17         cout << "A::not_virtual()" << endl;

18     }

19 

20     virtual void is_virtual(){

21         cout << "A::is_virtual()" << endl;

22     }

23 };

24 

25 class B : public A{

26 public:

27 

28     void not_virtual()

29     {

30         cout << "B::not_virtual()" << endl;

31     }

32 

33     virtual void is_virtual(){

34         cout << "B::is_virtual()" << endl;

35     }

36 };

37 

38 void foo(boost::any& a)

39 {

40     try{

41         boost::shared_ptr<A> ptr = boost::any_cast<boost::shared_ptr<A> >(a);

42         cout << "This any contained a boost::shared_ptr<A>" << endl;

44         ptr->is_virtual();

45         ptr->not_virtual();

46         return;

47     }

48     catch(boost::bad_any_cast& e){}

49 

50     try{

51         boost::shared_ptr<B> ptr = boost::any_cast<boost::shared_ptr<B> >(a);

52         cout << "This any contained a boost::shared_ptr<B>" << endl;

53 

54         ptr->is_virtual();

55         ptr->not_virtual();

56         return;

57     }

58     catch(boost::bad_any_cast& e){}

60     cout << "The any didn't contain anything that concerns this function!" << endl;

62 

63 int main()

64 {

65     cout << "Example of any and shared_ptr" << endl;

66     boost::any a1(boost::shared_ptr<A>(new A));

67     boost::any a2(string("Just a string"));

68 

69     {

70         boost::any b1(boost::shared_ptr<A>(new B));

71         boost::any b2(boost::shared_ptr<B>(new B));

72         std::vector<boost::any> vec;

73         vec.push_back(a1);

74         vec.push_back(a2);

75         vec.push_back(b1);

76         vec.push_back(b2);

77 

78         for_each(vec.begin(),vec.end(),foo);

79         cout << "\n";

80     }

81 

82     cout << "any's b1 and b2 have been destroyed which means that the shared_ptrs' reference counts became zero\n";

83 

84     cin.get();

85 }