1 2 // (C) Copyright Tobias Schwinger 3 // 4 // Use modification and distribution are subject to the boost Software License, 5 // Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt). 6 7 //------------------------------------------------------------------------------ 8 // See interface.hpp in this directory for details. 9 10 #include <iostream> 11 #include <typeinfo> 12 13 #include "interface.hpp" 14 15 16 BOOST_EXAMPLE_INTERFACE( interface_x, 17 (( a_func, (void)(int) , const_qualified )) 18 (( a_func, (void)(long), const_qualified )) 19 (( another_func, (int) , non_const )) 20 ); 21 22 23 // two classes that implement interface_x 24 25 struct a_class 26 { a_funca_class27 void a_func(int v) const 28 { 29 std::cout << "a_class::void a_func(int v = " << v << ")" << std::endl; 30 } 31 a_funca_class32 void a_func(long v) const 33 { 34 std::cout << "a_class::void a_func(long v = " << v << ")" << std::endl; 35 } 36 another_funca_class37 int another_func() 38 { 39 std::cout << "a_class::another_func() = 3" << std::endl; 40 return 3; 41 } 42 }; 43 44 struct another_class 45 { 46 // note: overloaded a_func implemented as a function template 47 template<typename T> a_funcanother_class48 void a_func(T v) const 49 { 50 std::cout << 51 "another_class::void a_func(T v = " << v << ")" 52 " [ T = " << typeid(T).name() << " ]" << std::endl; 53 } 54 another_funcanother_class55 int another_func() 56 { 57 std::cout << "another_class::another_func() = 5" << std::endl; 58 return 5; 59 } 60 }; 61 62 63 // both classes above can be assigned to the interface variable and their 64 // member functions can be called through it main()65int main() 66 { 67 a_class x; 68 another_class y; 69 70 interface_x i(x); 71 i.a_func(12); 72 i.a_func(77L); 73 i.another_func(); 74 75 i = y; 76 i.a_func(13); 77 i.a_func(21L); 78 i.another_func(); 79 } 80 81