actor.hpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605
  1. /*=============================================================================
  2. Phoenix v1.2
  3. Copyright (c) 2001-2002 Joel de Guzman
  4. Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. ==============================================================================*/
  7. #ifndef PHOENIX_ACTOR_HPP
  8. #define PHOENIX_ACTOR_HPP
  9. ///////////////////////////////////////////////////////////////////////////////
  10. #include <boost/spirit/home/classic/phoenix/tuples.hpp>
  11. #include <boost/type_traits/remove_reference.hpp>
  12. ///////////////////////////////////////////////////////////////////////////////
  13. namespace phoenix {
  14. // These are forward declared here because we cannot include impl.hpp
  15. // or operators.hpp yet but the actor's assignment operator and index
  16. // operator are required to be members.
  17. //////////////////////////////////
  18. struct assign_op;
  19. struct index_op;
  20. //////////////////////////////////
  21. namespace impl {
  22. template <typename OperationT, typename BaseT, typename B>
  23. struct make_binary1;
  24. }
  25. ///////////////////////////////////////////////////////////////////////////////
  26. //
  27. // unpack_tuple class
  28. //
  29. // This class is used to unpack a supplied tuple such, that the members of
  30. // this tuple will be handled as if they would be supplied separately.
  31. //
  32. ///////////////////////////////////////////////////////////////////////////////
  33. template <typename TupleT>
  34. struct unpack_tuple : public TupleT {
  35. typedef TupleT tuple_t;
  36. unpack_tuple() {}
  37. unpack_tuple(tuple_t const &tuple_) : TupleT(tuple_) {}
  38. };
  39. ///////////////////////////////////////////////////////////////////////////////
  40. //
  41. // actor class
  42. //
  43. // This class is a protocol class for all actors. This class is
  44. // essentially an interface contract. The actor class does not
  45. // really know how how to act on anything but instead relies on the
  46. // template parameter BaseT (from which the actor will derive from)
  47. // to do the actual action.
  48. //
  49. // An actor is a functor that is capable of accepting arguments up
  50. // to a predefined maximum. It is up to the base class to do the
  51. // actual processing or possibly to limit the arity (no. of
  52. // arguments) passed in. Upon invocation of the functor through a
  53. // supplied operator(), the actor funnels the arguments passed in
  54. // by the client into a tuple and calls the base eval member
  55. // function.
  56. //
  57. // Schematically:
  58. //
  59. // arg0 ---------|
  60. // arg1 ---------|
  61. // arg2 ---------|---> tupled_args ---> base.eval
  62. // ... |
  63. // argN ---------|
  64. //
  65. // actor::operator()(arg0, arg1... argN)
  66. // ---> BaseT::eval(tupled_args);
  67. //
  68. // Actor base classes from which this class inherits from are
  69. // expected to have a corresponding member function eval compatible
  70. // with the conceptual Interface:
  71. //
  72. // template <typename TupleT>
  73. // actor_return_type
  74. // eval(TupleT const& args) const;
  75. //
  76. // where args are the actual arguments passed in by the client
  77. // funneled into a tuple (see tuple.hpp for details).
  78. //
  79. // The actor_return_type can be anything. Base classes are free to
  80. // return any type, even argument dependent types (types that are
  81. // deduced from the types of the arguments). After evaluating the
  82. // parameters and doing some computations or actions, the eval
  83. // member function concludes by returning something back to the
  84. // client. To do this, the forwarding function (the actor's
  85. // operator()) needs to know the return type of the eval member
  86. // function that it is calling. For this purpose, actor base
  87. // classes are required to provide a nested template class:
  88. //
  89. // template <typename TupleT>
  90. // struct result;
  91. //
  92. // This auxiliary class provides the result type information
  93. // returned by the eval member function of a base actor class. The
  94. // nested template class result should have a typedef 'type' that
  95. // reflects the return type of its member function eval. It is
  96. // basically a type computer that answers the question "given
  97. // arguments packed into a TupleT type, what will be the result
  98. // type of the eval member function of ActorT?". The template class
  99. // actor_result queries this to extract the return type of an
  100. // actor. Example:
  101. //
  102. // typedef typename actor_result<ActorT, TupleT>::type
  103. // actor_return_type;
  104. //
  105. // where actor_return_type is the actual type returned by ActorT's
  106. // eval member function given some arguments in a TupleT.
  107. //
  108. ///////////////////////////////////////////////////////////////////////////////
  109. template <typename ActorT, typename TupleT>
  110. struct actor_result {
  111. typedef typename ActorT::template result<TupleT>::type type;
  112. typedef typename boost::remove_reference<type>::type plain_type;
  113. };
  114. //////////////////////////////////
  115. #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
  116. #pragma warning(push)
  117. #pragma warning(disable:4512) //assignment operator could not be generated
  118. #endif
  119. template <typename BaseT>
  120. struct actor : public BaseT {
  121. actor();
  122. actor(BaseT const& base);
  123. typename actor_result<BaseT, tuple<> >::type
  124. operator()() const;
  125. template <typename A>
  126. typename actor_result<BaseT, tuple<A&> >::type
  127. operator()(A& a) const;
  128. template <typename A, typename B>
  129. typename actor_result<BaseT, tuple<A&, B&> >::type
  130. operator()(A& a, B& b) const;
  131. template <typename A, typename B, typename C>
  132. typename actor_result<BaseT, tuple<A&, B&, C&> >::type
  133. operator()(A& a, B& b, C& c) const;
  134. #if PHOENIX_LIMIT > 3
  135. template <typename A, typename B, typename C, typename D>
  136. typename actor_result<BaseT, tuple<A&, B&, C&, D&> >::type
  137. operator()(A& a, B& b, C& c, D& d) const;
  138. template <typename A, typename B, typename C, typename D, typename E>
  139. typename actor_result<BaseT, tuple<A&, B&, C&, D&, E&> >::type
  140. operator()(A& a, B& b, C& c, D& d, E& e) const;
  141. template <
  142. typename A, typename B, typename C, typename D, typename E,
  143. typename F>
  144. typename actor_result<BaseT, tuple<A&, B&, C&, D&, E&, F&> >::type
  145. operator()(A& a, B& b, C& c, D& d, E& e, F& f) const;
  146. #if PHOENIX_LIMIT > 6
  147. template <
  148. typename A, typename B, typename C, typename D, typename E,
  149. typename F, typename G>
  150. typename actor_result<BaseT, tuple<A&, B&, C&, D&, E&, F&, G&> >::type
  151. operator()(A& a, B& b, C& c, D& d, E& e, F& f, G& g) const;
  152. template <
  153. typename A, typename B, typename C, typename D, typename E,
  154. typename F, typename G, typename H>
  155. typename actor_result<BaseT,
  156. tuple<A&, B&, C&, D&, E&, F&, G&, H&>
  157. >::type
  158. operator()(A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h) const;
  159. template <
  160. typename A, typename B, typename C, typename D, typename E,
  161. typename F, typename G, typename H, typename I>
  162. typename actor_result<BaseT,
  163. tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&>
  164. >::type
  165. operator()(A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i) const;
  166. #if PHOENIX_LIMIT > 9
  167. template <
  168. typename A, typename B, typename C, typename D, typename E,
  169. typename F, typename G, typename H, typename I, typename J>
  170. typename actor_result<BaseT,
  171. tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&>
  172. >::type
  173. operator()(
  174. A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j) const;
  175. template <
  176. typename A, typename B, typename C, typename D, typename E,
  177. typename F, typename G, typename H, typename I, typename J,
  178. typename K>
  179. typename actor_result<BaseT,
  180. tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&>
  181. >::type
  182. operator()(
  183. A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,
  184. K& k) const;
  185. template <
  186. typename A, typename B, typename C, typename D, typename E,
  187. typename F, typename G, typename H, typename I, typename J,
  188. typename K, typename L>
  189. typename actor_result<BaseT,
  190. tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&>
  191. >::type
  192. operator()(
  193. A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,
  194. K& k, L& l) const;
  195. #if PHOENIX_LIMIT > 12
  196. template <
  197. typename A, typename B, typename C, typename D, typename E,
  198. typename F, typename G, typename H, typename I, typename J,
  199. typename K, typename L, typename M>
  200. typename actor_result<BaseT,
  201. tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&>
  202. >::type
  203. operator()(
  204. A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,
  205. K& k, L& l, M& m) const;
  206. template <
  207. typename A, typename B, typename C, typename D, typename E,
  208. typename F, typename G, typename H, typename I, typename J,
  209. typename K, typename L, typename M, typename N>
  210. typename actor_result<BaseT,
  211. tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&, N&>
  212. >::type
  213. operator()(
  214. A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,
  215. K& k, L& l, M& m, N& n) const;
  216. template <
  217. typename A, typename B, typename C, typename D, typename E,
  218. typename F, typename G, typename H, typename I, typename J,
  219. typename K, typename L, typename M, typename N, typename O>
  220. typename actor_result<BaseT,
  221. tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&, N&, O&>
  222. >::type
  223. operator()(
  224. A& a, B& b, C& c, D& d, E& e, F& f, G& g, H& h, I& i, J& j,
  225. K& k, L& l, M& m, N& n, O& o) const;
  226. #endif
  227. #endif
  228. #endif
  229. #endif
  230. template <typename TupleT>
  231. typename actor_result<BaseT, unpack_tuple<TupleT> >::type
  232. operator()(unpack_tuple<TupleT> const &t) const;
  233. template <typename B>
  234. typename impl::make_binary1<assign_op, BaseT, B>::type
  235. operator=(B const& b) const;
  236. template <typename B>
  237. typename impl::make_binary1<index_op, BaseT, B>::type
  238. operator[](B const& b) const;
  239. };
  240. #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
  241. #pragma warning(pop)
  242. #endif
  243. ///////////////////////////////////////////////////////////////////////////
  244. //
  245. // as_actor
  246. //
  247. // as_actor is a meta-program that converts an arbitrary type into
  248. // an actor. All participants in the framework must be first-class
  249. // actors. This meta-program is used all throughout the framework
  250. // whenever an unknown type needs to be converted to an actor.
  251. // as_actor specializations are expected to have a typedef 'type'.
  252. // This is the destination actor type. A static member function
  253. // 'convert' converts an object to this target type.
  254. //
  255. // The meta-program does no conversion if the object to be
  256. // converted is already an actor.
  257. //
  258. ///////////////////////////////////////////////////////////////////////////
  259. template <typename T>
  260. struct as_actor;
  261. //////////////////////////////////
  262. template <typename BaseT>
  263. struct as_actor<actor<BaseT> > {
  264. typedef actor<BaseT> type;
  265. static type convert(actor<BaseT> const& x) { return x; }
  266. };
  267. //////////////////////////////////
  268. template <>
  269. struct as_actor<nil_t> {
  270. typedef nil_t type;
  271. static nil_t convert(nil_t /*x*/)
  272. { return nil_t(); }
  273. };
  274. //////////////////////////////////
  275. template <>
  276. struct as_actor<void> {
  277. typedef void type;
  278. // ERROR!!!
  279. };
  280. ///////////////////////////////////////////////////////////////////////////////
  281. //
  282. // actor class implementation
  283. //
  284. ///////////////////////////////////////////////////////////////////////////////
  285. template <typename BaseT>
  286. actor<BaseT>::actor()
  287. : BaseT() {}
  288. //////////////////////////////////
  289. template <typename BaseT>
  290. actor<BaseT>::actor(BaseT const& base)
  291. : BaseT(base) {}
  292. //////////////////////////////////
  293. template <typename BaseT>
  294. inline typename actor_result<BaseT, tuple<> >::type
  295. actor<BaseT>::operator()() const
  296. {
  297. return BaseT::eval(tuple<>());
  298. }
  299. //////////////////////////////////
  300. template <typename BaseT>
  301. template <typename A>
  302. inline typename actor_result<BaseT, tuple<A&> >::type
  303. actor<BaseT>::operator()(A& a_) const
  304. {
  305. return BaseT::eval(tuple<A&>(a_));
  306. }
  307. //////////////////////////////////
  308. template <typename BaseT>
  309. template <typename A, typename B>
  310. inline typename actor_result<BaseT, tuple<A&, B&> >::type
  311. actor<BaseT>::operator()(A& a_, B& b_) const
  312. {
  313. return BaseT::eval(tuple<A&, B&>(a_, b_));
  314. }
  315. //////////////////////////////////
  316. template <typename BaseT>
  317. template <typename A, typename B, typename C>
  318. inline typename actor_result<BaseT, tuple<A&, B&, C&> >::type
  319. actor<BaseT>::operator()(A& a_, B& b_, C& c_) const
  320. {
  321. return BaseT::eval(tuple<A&, B&, C&>(a_, b_, c_));
  322. }
  323. #if PHOENIX_LIMIT > 3
  324. //////////////////////////////////
  325. template <typename BaseT>
  326. template <typename A, typename B, typename C, typename D>
  327. inline typename actor_result<BaseT, tuple<A&, B&, C&, D&> >::type
  328. actor<BaseT>::operator()(A& a_, B& b_, C& c_, D& d_) const
  329. {
  330. return BaseT::eval(tuple<A&, B&, C&, D&>(a_, b_, c_, d_));
  331. }
  332. //////////////////////////////////
  333. template <typename BaseT>
  334. template <typename A, typename B, typename C, typename D, typename E>
  335. inline typename actor_result<BaseT, tuple<A&, B&, C&, D&, E&> >::type
  336. actor<BaseT>::operator()(A& a_, B& b_, C& c_, D& d_, E& e_) const
  337. {
  338. return BaseT::eval(tuple<A&, B&, C&, D&, E&>(a_, b_, c_, d_, e_));
  339. }
  340. //////////////////////////////////
  341. template <typename BaseT>
  342. template <
  343. typename A, typename B, typename C, typename D, typename E,
  344. typename F>
  345. inline typename actor_result<BaseT,
  346. tuple<A&, B&, C&, D&, E&, F&>
  347. >::type
  348. actor<BaseT>::operator()(
  349. A& a_, B& b_, C& c_, D& d_, E& e_, F& f_
  350. ) const
  351. {
  352. return BaseT::eval(
  353. tuple<A&, B&, C&, D&, E&, F&>
  354. (a_, b_, c_, d_, e_, f_)
  355. );
  356. }
  357. #if PHOENIX_LIMIT > 6
  358. //////////////////////////////////
  359. template <typename BaseT>
  360. template <
  361. typename A, typename B, typename C, typename D, typename E,
  362. typename F, typename G>
  363. inline typename actor_result<BaseT,
  364. tuple<A&, B&, C&, D&, E&, F&, G&>
  365. >::type
  366. actor<BaseT>::operator()(
  367. A& a_, B& b_, C& c_, D& d_, E& e_, F& f_, G& g_
  368. ) const
  369. {
  370. return BaseT::eval(
  371. tuple<A&, B&, C&, D&, E&, F&, G&>
  372. (a_, b_, c_, d_, e_, f_, g_)
  373. );
  374. }
  375. //////////////////////////////////
  376. template <typename BaseT>
  377. template <
  378. typename A, typename B, typename C, typename D, typename E,
  379. typename F, typename G, typename H>
  380. inline typename actor_result<BaseT,
  381. tuple<A&, B&, C&, D&, E&, F&, G&, H&>
  382. >::type
  383. actor<BaseT>::operator()(
  384. A& a_, B& b_, C& c_, D& d_, E& e_, F& f_, G& g_, H& h_
  385. ) const
  386. {
  387. return BaseT::eval(
  388. tuple<A&, B&, C&, D&, E&, F&, G&, H&>
  389. (a_, b_, c_, d_, e_, f_, g_, h_)
  390. );
  391. }
  392. //////////////////////////////////
  393. template <typename BaseT>
  394. template <
  395. typename A, typename B, typename C, typename D, typename E,
  396. typename F, typename G, typename H, typename I>
  397. inline typename actor_result<BaseT,
  398. tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&>
  399. >::type
  400. actor<BaseT>::operator()(
  401. A& a_, B& b_, C& c_, D& d_, E& e_, F& f_, G& g_, H& h_, I& i_
  402. ) const
  403. {
  404. return BaseT::eval(
  405. tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&>
  406. (a_, b_, c_, d_, e_, f_, g_, h_, i_)
  407. );
  408. }
  409. #if PHOENIX_LIMIT > 9
  410. //////////////////////////////////
  411. template <typename BaseT>
  412. template <
  413. typename A, typename B, typename C, typename D, typename E,
  414. typename F, typename G, typename H, typename I, typename J>
  415. inline typename actor_result<BaseT,
  416. tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&>
  417. >::type
  418. actor<BaseT>::operator()(
  419. A& a_, B& b_, C& c_, D& d_, E& e_, F& f_, G& g_, H& h_, I& i_, J& j_
  420. ) const
  421. {
  422. return BaseT::eval(
  423. tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&>
  424. (a_, b_, c_, d_, e_, f_, g_, h_, i_, j_)
  425. );
  426. }
  427. //////////////////////////////////
  428. template <typename BaseT>
  429. template <
  430. typename A, typename B, typename C, typename D, typename E,
  431. typename F, typename G, typename H, typename I, typename J,
  432. typename K>
  433. inline typename actor_result<BaseT,
  434. tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&>
  435. >::type
  436. actor<BaseT>::operator()(
  437. A& a_, B& b_, C& c_, D& d_, E& e_, F& f_, G& g_, H& h_, I& i_, J& j_,
  438. K& k_
  439. ) const
  440. {
  441. return BaseT::eval(
  442. tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&>
  443. (a_, b_, c_, d_, e_, f_, g_, h_, i_, j_, k_)
  444. );
  445. }
  446. //////////////////////////////////
  447. template <typename BaseT>
  448. template <
  449. typename A, typename B, typename C, typename D, typename E,
  450. typename F, typename G, typename H, typename I, typename J,
  451. typename K, typename L>
  452. inline typename actor_result<BaseT,
  453. tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&>
  454. >::type
  455. actor<BaseT>::operator()(
  456. A& a_, B& b_, C& c_, D& d_, E& e_, F& f_, G& g_, H& h_, I& i_, J& j_,
  457. K& k_, L& l_
  458. ) const
  459. {
  460. return BaseT::eval(
  461. tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&>
  462. (a_, b_, c_, d_, e_, f_, g_, h_, i_, j_, k_, l_)
  463. );
  464. }
  465. #if PHOENIX_LIMIT > 12
  466. //////////////////////////////////
  467. template <typename BaseT>
  468. template <
  469. typename A, typename B, typename C, typename D, typename E,
  470. typename F, typename G, typename H, typename I, typename J,
  471. typename K, typename L, typename M>
  472. inline typename actor_result<BaseT,
  473. tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&>
  474. >::type
  475. actor<BaseT>::operator()(
  476. A& a_, B& b_, C& c_, D& d_, E& e_, F& f_, G& g_, H& h_, I& i_, J& j_,
  477. K& k_, L& l_, M& m_
  478. ) const
  479. {
  480. return BaseT::eval(
  481. tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&>
  482. (a_, b_, c_, d_, e_, f_, g_, h_, i_, j_, k_, l_, m_)
  483. );
  484. }
  485. //////////////////////////////////
  486. template <typename BaseT>
  487. template <
  488. typename A, typename B, typename C, typename D, typename E,
  489. typename F, typename G, typename H, typename I, typename J,
  490. typename K, typename L, typename M, typename N>
  491. inline typename actor_result<BaseT,
  492. tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&, N&>
  493. >::type
  494. actor<BaseT>::operator()(
  495. A& a_, B& b_, C& c_, D& d_, E& e_, F& f_, G& g_, H& h_, I& i_, J& j_,
  496. K& k_, L& l_, M& m_, N& n_
  497. ) const
  498. {
  499. return BaseT::eval(
  500. tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&, N&>
  501. (a_, b_, c_, d_, e_, f_, g_, h_, i_, j_, k_, l_, m_, n_)
  502. );
  503. }
  504. //////////////////////////////////
  505. template <typename BaseT>
  506. template <
  507. typename A, typename B, typename C, typename D, typename E,
  508. typename F, typename G, typename H, typename I, typename J,
  509. typename K, typename L, typename M, typename N, typename O>
  510. inline typename actor_result<BaseT,
  511. tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&, N&, O&>
  512. >::type
  513. actor<BaseT>::operator()(
  514. A& a_, B& b_, C& c_, D& d_, E& e_, F& f_, G& g_, H& h_, I& i_, J& j_,
  515. K& k_, L& l_, M& m_, N& n_, O& o_
  516. ) const
  517. {
  518. return BaseT::eval(
  519. tuple<A&, B&, C&, D&, E&, F&, G&, H&, I&, J&, K&, L&, M&, N&, O&>
  520. (a_, b_, c_, d_, e_, f_, g_, h_, i_, j_, k_, l_, m_, n_, o_)
  521. );
  522. }
  523. #endif
  524. #endif
  525. #endif
  526. #endif
  527. //////////////////////////////////
  528. template <typename BaseT>
  529. template <typename TupleT>
  530. typename actor_result<BaseT, unpack_tuple<TupleT> >::type
  531. actor<BaseT>::operator()(unpack_tuple<TupleT> const &t) const
  532. {
  533. return BaseT::eval(t);
  534. }
  535. ///////////////////////////////////////////////////////////////////////////////
  536. } // namespace phoenix
  537. #endif