gpt4 book ai didi

c++ - 具有通过 int 参数化的模板参数的模板函数

转载 作者:行者123 更新时间:2023-12-02 01:49:26 25 4
gpt4 key购买 nike

不使用 C++11 及更高版本的功能(我会接受它们,但更喜欢 C++98),

我必须编写一个带有参数 T 的模板函数,它是 int 的 STL 容器s。它收到这样一个容器以及另一个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>但仍然无法编译。

最佳答案

[注意]此答案使用C++20。 @PatrickRoberts 让我注意到您最好请求一个 C++98 解决方案。不管怎样,我还是把它留下了,因为它可能对你有帮助。

您只需为模板添加一个要求,检查容器的类型是否为 int

[Demo]

#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";
//}
}

关于c++ - 具有通过 int 参数化的模板参数的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70498030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com