gpt4 book ai didi

c++ - 为模板参数推断层次结构中的最低类型

转载 作者:行者123 更新时间:2023-11-28 04:35:11 26 4
gpt4 key购买 nike

我正在尝试使用模板,但我还是个新手。调用此函数时:

template <typename A, typename B, template<typename> typename Traversable, 
typename Fn>
auto map(const Traversable<A>& vec, Fn&& fn)
{
Traversable<B> res{};
for (A e : vec)
res.push_back(fn(e));
return res;
}

像这样:

vector<int> numbers { 1,2,3,4,5 };
auto numbers_times_two = map(numbers, [](auto a) { return a * 2; });

我收到歧义错误:

Inferred conflicting substitutions for template parameter Traversable (std::vector and std::_Vector_alloc)

在我看来,编译器不知道是要推导出 vector 还是 Traversable 参数的父类(super class)。

显式指定模板参数的情况下调用 map 编译的最佳方法是什么?一个适用于其他前向迭代的解决方案,如 forward_listarray 将不胜感激。

在这种情况下,是否有通用的解决方案来推导出最具体的类而不是父类(super class)?

编辑:这只发生在 VS2017 编译器上,但适用于 g++。

所以在使用Jarod42s answer之后我制作了自己的容器类,只是为了看看错误是否仍然发生:

template <typename T>
class NewVec : public vector<T>
{
public:
NewVec(initializer_list<T> il): vector<T>(il) {}
};

int main()
{
NewVec<int> nv{ 1,2,3,4,5 };
auto doubled = map(nv, [](auto a) { return a * 2; });
}

现在调用编译没有问题。但是 vectorforward_list 仍然会产生上述错误。

最佳答案

您可能会使用:

template <template <typename, typename...> class Container, typename T, typename F>
auto map(const Container<T>& vec, F&& f)
{
using RetType = std::decay_t<decltype(f(*vec.begin()))>;
Container<RetType> res{};
for (auto&& e : vec)
res.push_back(f(e));
return res;
}

Demo

所以所有类型都是可推导的。

理想情况下,我什至会删除 T 并使用分配器提供的 rebind::other,但容器不提供它。

关于c++ - 为模板参数推断层次结构中的最低类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51663546/

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