咋一看你能看明白吗?

咋一看你能看明白这是什么吗?来自<boost/signals/signal_template.hpp>

 1   template<

 2     typename R,

 3     BOOST_SIGNALS_TEMPLATE_PARMS

 4     BOOST_SIGNALS_COMMA_IF_NONZERO_ARGS

 5     typename Combiner,

 6     typename Group,

 7     typename GroupCompare,

 8     typename SlotFunction

 9   >

10   typename BOOST_SIGNALS_SIGNAL<

11              R, BOOST_SIGNALS_TEMPLATE_ARGS

12              BOOST_SIGNALS_COMMA_IF_NONZERO_ARGS

13              Combiner, Group, GroupCompare, SlotFunction>::result_type

14   BOOST_SIGNALS_SIGNAL<

15     R, BOOST_SIGNALS_TEMPLATE_ARGS

16     BOOST_SIGNALS_COMMA_IF_NONZERO_ARGS

17     Combiner, Group, GroupCompare, SlotFunction

18   >::operator()(BOOST_SIGNALS_PARMS)

19   {

20     // Notify the slot handling code that we are making a call

21     BOOST_SIGNALS_NAMESPACE::detail::call_notification notification(this->impl);

22 

23     // Construct a function object that will call the underlying slots

24     // with the given arguments.

25 #if BOOST_SIGNALS_NUM_ARGS == 0

26     BOOST_SIGNALS_ARGS_STRUCT_INST args;

27 #else

28     BOOST_SIGNALS_ARGS_STRUCT_INST args(BOOST_SIGNALS_ARGS);

29 #endif // BOOST_SIGNALS_NUM_ARGS > 0

30     call_bound_slot f(&args);

31 

32     typedef typename call_bound_slot::result_type call_result_type;

33     optional<call_result_type> cache;

34     // Let the combiner call the slots via a pair of input iterators

35     return combiner()(slot_call_iterator(notification.impl->slots_.begin(),

36                                          impl->slots_.end(), f, cache),

37                       slot_call_iterator(notification.impl->slots_.end(),

38                                          impl->slots_.end(), f, cache));

39   }

尤其后面35行的“return combiner()(slot_call_iterator(notification.impl->slots_.begin(), 36 impl->slots_.end(), f, cache), 37 slot_call_iterator(notification.impl->slots_.end(), 38 impl->slots_.end(), f, cache));

我也是被这句话困扰了半个小时,后来追踪源码和自己理解终于明白了。

请看下面的简单模拟

 1 #include <boost/signals.hpp>

 2 #include <iostream>

 3 

 4 int testadd(int a, int b)

 5 {

 6     return a+b;

 7 }

 8 typedef int(*pfun)(int, int);

 9 pfun testfun()

10 {

11     return &testadd;

12 }

13 class testclass

14 {

15 private:

16     int a;

17     int b;

18 

19 public:

20     testclass() {}

21     testclass(int x, int y) : a(x), b(y) {}

22     int operator()()

23     {

24         return testfun()(a, b);

25     }

26 };

27 

28 int _tmain(int argc, _TCHAR* argv[])

29 {

30     testclass obj(3, 4);

31     std::cout << obj() << std::endl;

32 

33     return 0;

34 }

通过上面的代码你能看明白了吧,恩C++的语法方面就是比较复杂,一不留神就发现可能“很陌生”。

 

 

上面的问题的产生主要来自我对boost::Signals的学习

下面是书上的示例:

 1 #include <boost/signals.hpp>

 2 #include <iostream>

 3 

 4 void my_first_slot()

 5 {

 6     std::cout << "void my_first_slot()\n";

 7 }

 8 class my_second_slot

 9 {

10 public:

11     void operator()() const {    std::cout <<      "void my_second_slot::operator()() const\n";  }

12 };

13 

14 int _tmain(int argc, _TCHAR* argv[])

15 {

16     boost::signal<void ()> sig;

17     sig.connect(&my_first_slot);

18     sig.connect(my_second_slot());

19     std::cout << "Emitting a signal...\n";

20     sig();

21 

22     return 0;

23 }

20行的sig()引发的思考。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(咋一看你能看明白吗?)