2013-04-16 35 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迭代。但问题是,我不知道,它会是什么类型。它也可以是单个stringvector<int>/<string>。所以当有string时,它只会迭代一次,如果有一个向量迭代(myVector.count()-1)时。如何使这种类型独立迭代器?

+0

以下划线后跟大写字母('_Type')开头的名称和包含两个连续下划线的名称保留给实现。不要使用它们。 –

+1

'_Type'是一种已知类型,除非您将其用作模板占位符。 'Search'是模板函数吗? – 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; 
}; 

根据您的实际需求,你会通过typename C::value_type

+0

哦..我忘了提及,我不能改变搜索功能的声明..它必须保持,因为它是..'设置搜索(const _Type&hayHeap)常量' – Dworza

+1

然后,不要更改它。我只更改了'_Type'的_name_(这是我做的,因为带有下划线的名字经常被保留用于标准库实现。 – sehe

+0

@MarkB实际上,我的捷径措词非常小心。所以,的确,“带前导下划线的名字经常被保留”,并不总是(我没有说它取决于编译器或库,它只取决于其余的标识符:)) – sehe

1

OK我想更换int我现在明白你的问题。我认为你正在寻找某种类型的功能。这种东西。

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


}