كيفية استخدام الأمراض المنقولة جنسيا :: تحويل مع قوالب

StackOverflow https://stackoverflow.com/questions/1809816

سؤال

وأنا تكافح لمعرفة لماذا لا أستطيع الحصول على تحويل للعمل مع فئة القالب.

وفيما يلي نسخة مبسطة من فئة القالب:

template<typename T>
class base
{
public :
  base() : all_() {}
  ~base() {}
public:
  bool add(T t)
  {
    typename vector<T>::iterator itr 
      = lower_bound(all_.begin(), all_.end(), t);
    if ( itr == all_.end() || *itr != t )
      {
        all_.push_back(t);
        cout << "ok" << endl;
        return true;
      }
    cout << "failed" << endl;
    return false;
  }
  static bool addTo(base<T> *c, T t)
  {
    return c->add(t);
  }
private :
  vector<T> all_;
};

وهذا هو المكان الذي أنا أحاول أن استخدام تحويل لالتقاط كافة الإخراج منطقي من وظيفة عضو اضافة:

main()
{
  base<int> test;
  vector<bool> results;
  vector<int> toAdd;
  toAdd.push_back(10);
  toAdd.push_back(11);
  toAdd.push_back(10);
  transform( toAdd.begin(), toAdd.end(),
             back_inserter(results),
             bind1st( (bool(*)(base<int>*,int))base<int>::addTo, &test ) );
}

والهدف هو إدراج كل عضو في حاوية TOADD باستخدام قاعدة :: إضافة أو قاعدة :: addTo، والاستيلاء على النتائج منطقي في نتائج ناقلات

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

المحلول

وجرب:

  transform( toAdd.begin(), toAdd.end(),
         back_inserter(results),
         bind1st( mem_fun(&base<int>::add), &test ) );

والمشكلة ليست في القالب، فهو أن bind1st تعتمد على دعم إضافي للعمل (انظر <لأ href = "http://www.sgi.com/tech/stl/AdaptableBinaryFunction.html" يختلط = "نوفولو noreferrer "> http://www.sgi.com/tech/stl/AdaptableBinaryFunction.html ). AFAIK أنه لا يمكن أن تعمل من أي وقت مضى على سهل مؤشرات الدالة القديمة.

وboost::bind يمكن أن تفعل المزيد من الأشياء، إذا كنت ترغب في تحقيق ذلك في لهذا الوضع لم يكن في حاجة إليها، على الرغم من:. mem_fun يتحول دالة عضو غير ثابت في وظيفة ثنائية قابلة للتكيف. addTo بالتالي ليست هناك حاجة سواء، ولكن إذا لم تحتاج إلى استخدام دالة عضو ثابت في وضع مماثل ثم هناك ptr_fun.

نصائح أخرى

وإضافة ما يلي إلى الفئة الأساسية الخاصة بك:

typedef base<T>* first_argument_type;
typedef T second_argument_type;
typedef bool result_type;

bool operator () (base<T> *c, T t) const {
    return c->add(t);
}

ووتغيير تحويل إلى:

transform(toAdd.begin(), toAdd.end(),
          back_inserter(results), bind1st(base<int>(), &test ));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top