سؤال

u003CUpdate> كالعادة بالنسبة لي ، كان السؤال خطأ. والسؤال الفعلي هو: لماذا لا تستخدم revision_iterator النتيجة التقليدية _of <> metafunction لتحديد نوع الإرجاع ، بدلاً من الوصول إلى unaryfunc :: result_type مباشرة. أنشر إجابة مع عمل حولها. u003C/Update>

على وجه التحديد ، هل هناك طريقة لجعل تعبير فينيكس يعرض أ result_type اكتب كما هو متوقع لمفهوم std :: unary_function؟ Boost :: يبدو أن Transform_iterator يتوقع ذلك ، ومن النظر إلى SRC منه ، لا أرى عملًا بسيطًا.

إليك بعض التعليمات البرمجية التي تستنسخ المشكلة التي كنت أواجهها:

#include <boost/iterator/transform_iterator.hpp>
#include <boost/spirit/home/phoenix.hpp>
#include <numeric>
#include <iostream>

using namespace boost::phoenix;
using namespace boost::phoenix::arg_names;

int main(void){
   int i[] = {4,2,5,3};

   std::cout <<
      std::accumulate(
         boost::make_transform_iterator(i,   _1*_1),
         boost::make_transform_iterator(i+4, _1*_1),
         0
      ) << std::endl;

   return 0;
}

الجزء المتردد من رسالة الخطأ من تجميع هذا هو (GCC 4.3.4 ، Boost 1.43):

/usr/include/boost/iterator/transform_iterator.hpp:43: error: no type named ‘result_type’ in ‘struct boost::phoenix::actor<...

لدي نفس المشكلة مع Boost :: Lambda (مفقود result_type). اعتقدت أنني رأيت استخدامًا مشابهًا لـ Make_transform_iterator و Lambda في الماضي ، الآن أتساءل عما إذا كنت أتخيل ذلك للتو.

هل هناك غلاف متوفر أو آلية أخرى في فينيكس أو لامدا لفضح result_type?

هل كانت مفيدة؟

المحلول

يبدو أن هذا ثابت في تعزيز الجذع (انظر السطر 51 ، result_of<> بدلا من غير مباشر UnaryFunc::result_type). لذلك لا ينبغي أن يكون هذا مشكلة في 1.44 وما فوق.

إليك حل بديل للزيادة <1.44. تصل إلى إنشاء مثيل Transfor UnaryFunc::result_type فقط إذا Reference لا يتم توفير المعلمة قالب. لذا ، تتمثل إحدى الحيلة في استبدال make_transform_iterator بإصدار يستدعي وظيفة result_of <> meta على unaryfunc واستخدم النتيجة لمعلمة القالب المرجعي.

#include <boost/iterator/transform_iterator.hpp>
#include <boost/utility.hpp>
#include <iterator>

template <class UnaryFunc, class Iterator>
boost::transform_iterator<
   UnaryFunc,
   Iterator,
   typename boost::result_of<
      UnaryFunc(typename std::iterator_traits<Iterator>::value_type)
   >::type
>
make_trans_it(Iterator it, UnaryFunc fun){
   return
      boost::transform_iterator<
         UnaryFunc,
         Iterator,
         typename boost::result_of<
            UnaryFunc(typename std::iterator_traits<Iterator>::value_type)
         >::type
      >(it, fun);
};
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top