2013-04-16 4 views
3

Я получил эту функцию:Как перебирать неизвестный тип?

set<int> Search(const _Type & hayHeap) const { 
     set<int>myset; 
     for (vector<typename>::const_iterator i = needle.begin(); i != needle.end(); ++i) { 
      cout << (*i) << " "; 
     } 
     return myset; 
    }; 

и иглы определяется следующим образом: vector<string> needle;

Теперь мне нужно, чтобы создать другой итератор, который будет перебирать hayHeap. Но проблема в том, что я не знаю, какой это будет. Это может быть один string или vector от <int>/<string>. Поэтому, когда есть string, он выполняет итерацию только один раз, если есть какой-то вектор, он итерации (myVector.count()-1)-раз. Как сделать этот тип независимым итератором?

+0

Имена, начинающиеся с символа подчеркивания, за которым следует большая буква ('_Type'), и имена, содержащие два последовательных символа подчеркивания, зарезервированы для реализации. Не используйте их. –

+1

'_Type' является известным типом, если вы не используете его как заполнитель шаблона. Функция 'Поиск' является функцией шаблона? – deepmax

+1

Это звучит совершенно абсурдно. Просто перегружайте функцию три раза, один раз для каждого варианта. Что бы это означало иметь здесь вектор ? –

ответ

2

В C++ 03:

template <typename C> 
set<int> Search(const C& hayHeap) const { 
    set<int>myset; 
    for (typename C::const_iterator i = needle.begin(); i != needle.end(); ++i) { 
     cout << (*i) << " "; 
    } 
    return myset; 
}; 

В C++ 11:

template <typename C> 
set<int> Search(const C& hayHeap) const { 
    set<int>myset; 
    for (auto& i : needle) { 
     cout << i << " "; 
    } 
    return myset; 
}; 

В зависимости от реальных потребностей, вы бы заменить int на typename C::value_type

+0

oh..Я забыл упомянуть, что я не могу изменить объявление функции поиска .. он должен оставаться, как есть .. 'set Поиск (const _Type & hayHeap) const' – Dworza

+1

Тогда не меняйте Это. Я изменил только _name_ '_Type' (что я сделал, потому что имена с ведущими подчеркиваниями часто зарезервированы для реализации стандартной библиотеки. – sehe

+0

@MarkB На самом деле, моя краткая формулировка была довольно осторожной. Прочитайте комментарий Пита на вопрос о _actual_ деталях. Итак, действительно, «имена с лидирующими символами подчеркиваются« редко »зарезервированы». Не всегда. (Я не говорил, что это зависит от компилятора или библиотеки, это зависит только от остальной части идентификатора :)) – sehe

1

OK Я думаю, Теперь я понял ваш вопрос. Я думаю, вы ищете какую-то функцию типа. Что-то в этом роде.

template<typename T> 
struct my_selector { 
    static void search(T& t) { 
     cout << " Single string/int search" << endl; 
     bool b = t == "needle"; 
     cout << b; 
    } 
}; 

template<typename T> 
struct my_selector<vector<T>> { 
    static void search(vector<T>& needle) { 
     cout << " Vector search" << endl; 
     for (typename vector<T>::const_iterator i = needle.begin(); 
         i != needle.end(); ++i) 
     { 
      cout << (*i) << " "; 
     } 
    } 
}; 

int main() { 


    typedef std::vector<std::string> _Type; 
    _Type needle(4,"s"); 
    // Search function is selected based on type of _Type. 
    my_selector<_Type>::search(needle); 


    // typedef string _Type; 
    // _Type needle = "needle"; 
    // // Search function is selected based on type of _Type. 
    // my_selector<_Type>::search(needle); 


}