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
};




c++14