كيفية استخدام الأمراض المنقولة جنسيا :: تحويل مع قوالب
-
05-07-2019 - |
سؤال
وأنا تكافح لمعرفة لماذا لا أستطيع الحصول على تحويل للعمل مع فئة القالب.
وفيما يلي نسخة مبسطة من فئة القالب:
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 ));