如何迭代一个未知类型?

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<int>/<string>向量。 因此,如果有一个string,它只迭代一次,如果有一些向量,则迭代(myVector.count()-1)次。 如何创建这种类型无关的迭代器?


以下划线加大写字母(_Type)开头的名称和包含两个连续下划线的名称被保留供实现使用。请不要使用它们。 - Pete Becker
1
"_Type" 是一个已知类型,除非您将其用作模板占位符。 "Search" 是一个模板函数吗? - masoud
1
这听起来像是一个完全荒谬的要求。只需将函数重载三次,每种变体重载一次即可。在这里使用vector<int>甚至意味着什么? - Sebastian Redl
2个回答

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

哦...我忘了提到,我不能改变Search函数的声明...它必须保持不变,就像这样:set<int> Search(const _Type & hayHeap) const - Martin Dvoracek
1
那么,请不要更改它。我只更改了 '_Type' 的名称(这是因为具有前置下划线的名称常常被保留用于标准库实现)。 - sehe
@MarkB 实际上,我的快捷用语非常小心。请阅读Pete在问题中的评论以获取实际细节。因此,“具有前导下划线的名称通常是保留的”。并不总是如此。(我没有说它取决于编译器或库;它只取决于标识符的其余部分:) - sehe

1

好的,我现在明白了您的问题。我认为您正在寻找某种类型函数。类似于这样的东西。

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


}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接