c++ - كيفية توفير توقيع الدالة لوظيفة أخذ متكررة من الحاويات stl؟
function templates (2)
أريد أن أكتب وظيفة
my_func
التي يمكن استدعاؤها على هذا النحو ، ولكن لا يهمني أن
v
هي
std::vector
، فقد تكون أي حاوية STL.
يشبه إلى حد ما
std::for_each
:
std::vector<std::string> v = {...};
my_func(v.begin(), v.end());
لكن لا يمكنني معرفة توقيع الوظيفة.
void my_func(??? i1, ??? i2)
{
std::for_each(i1, i2, ...); // dumb example implementation
}
لست
std::for_each
في برمجة القوالب ، لذلك حتى النظر إلى إعلان الوظيفة عن
std::for_each
لا يساعدني.
هل هناك سهولة في التنفيذ أم أن هذا سوف يتأثر بشكل أساسي باستخدام vars template؟
بناء الجملة ليس غامضا
جدا
!
تستخدم الطريقة التالية النطاق
for
بنقطة الاستخدام:
template <template<typename...> class Iterable, typename T>
void foo(
const Iterable<T>& y // the container
){
for (auto&& e : y){
// e is the 'thingy' in the container.
}
}
ويمكنك تمرير أي حاوية من النوع التعسفي إلى
foo
.
ذلك يعتمد على مدى رغبتك في أن تكون الوظيفة عامة. إذا كانت أنواع التكرار يجب أن تتطابق ، إذن
template <typename T>
void my_func(T i1, T i2)
{
std::for_each(i1,i2,...); //dumb example implementation
}
هو كل ما تحتاجه. إذا كنت تريد أن يكونوا قادرين على أن يكونوا مختلفين ، فأنت بحاجة إلى معلمة قالب أخرى مثل
template <typename T, typename U>
void my_func(T i1, U i2)
{
std::for_each(i1,i2,...); //dumb example implementation
}
أخيرًا ، إذا كنت لا تحب التعامل مع القوالب ، فيمكنك استخدام lambda بدلاً من ذلك والسماح للمترجم برعاية هذا نيابةً عنك. من شأنها أن تعطيك
auto my_func = [](auto i1, auto i2)
{
std::for_each(i1,i2,...); //dumb example implementation
};