不使用 C 11 及更高版本的特性(我會接受它們但更喜歡 C 98),
我必須撰寫一個帶有引數 T 的模板函式,它是ints的 STL 容器。它接收這樣一個容器以及int它試圖搜索的另一個容器,
現在我有這個,但它不能編譯:
template <template<int> class T>
T::iterator easyfind(T &container, int val)
{
T::iterator it = container.begin();
for ( ; it != container.end(); it )
if (val == *it)
break ;
return (it);
}
我想知道我是否可以以某種方式強制T引數始終是一個通過整數引數化的類模板......我嘗試撰寫T<int>但它仍然無法編譯。
uj5u.com熱心網友回復:
[注意]這個答案使用C 20. @PatrickRoberts 讓我注意到您最好請求C 98解決方案。無論如何我都會留下它,因為它可能對你有任何幫助。
你可以只為你的模板添加一個要求,檢查容器的型別是int.
[演示]
#include <iostream> // cout
#include <list>
#include <type_traits> // is_same
#include <vector>
template <typename C>
requires std::is_same<typename C::value_type, int>::value
auto easyfind(const C& container, int val)
{
for (auto it{std::cbegin(container)}; it != std::cend(container); it)
{
if (val == *it) { return it; }
}
return std::cend(container);
}
int main()
{
std::vector<int> vi{1, 2, 3};
if (auto it{easyfind(vi, 2)}; it != std::cend(vi))
{
std::cout << *it << "\n";
}
std::list<int> li{4, 5, 6};
if (auto it{easyfind(li, 8)}; it != std::cend(li))
{
std::cout << *it << "\n";
}
std::vector<double> vd{0.5, 1.3, 2.8};
//if (auto it{easyfind(vd, 1.3)}; it != std::cend(vd)) // error
//{
// std::cout << *it << "\n";
//}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/394768.html
