gpt4 book ai didi

c++ - 与模板成员函数的接口(interface)

转载 作者:可可西里 更新时间:2023-11-01 17:49:56 26 4
gpt4 key购买 nike

我有兴趣为 C++ 实现类似 Java 集合的环境。我知道这不是一个好主意等等,但我真的不想以后使用它,只是学习如何做一些高级 OOP。

我的问题是我想要一个基类模板 collection<T>具有纯虚函数。这些功能之一应该是 map()这需要 std::function<R(T)> .自 map()应该是虚拟的我不知道我应该为它使用哪种返回类型。 collection<R>不可能,因为成员函数模板不能是虚拟的。

如何添加这样的 map()我的成员函数 collection<T>界面?

最佳答案

How can I add such map member function for my collection<T> interface?

简短的回答是:你不知道。如果我有一些 collection<int>我想 map std::to_string在上面,我需要制作一个 collection<std::string> .但是一个vector_collection<int>需要生成 vector_collection<std::string>和一个 list_collection<int>需要生成 list_collection<std::string> - 因此类型转换本身需要是 virtual化。但是你不能有 virtual成员函数模板,所以没有办法表达这个。

为了使其工作,您必须为要放入容器中的所有对象使用一个通用的基类型,然后只需要一个可以在它们之间进行转换的通用外观。也就是说,你真的只有 collection<unique_ptr<Object>>其中 map只是给你一个不同的collection<unique_ptr<Object>> ,而你只是map你的collection_facade<int, collection<unique_ptr<Object>>>进入collection_facade<std::string, collection<unique_ptr<Object>>> .通过大量工作并完全无视性能和类型安全,您可以到达那里。


这是模板的优势。如果我想写 map对于像 vector 这样的东西,我可以这样写:

template <class T, class A, class F, class R = std::result_of_t<F(T)>>
std::vector<R, A> map(std::vector<T, A> const& v, F f) {
std::vector<R, A> mapped;
mapped.reserve(v.size());
for (T const& elem : v) {
mapped.push_back(f(elem));
}
return mapped;
}

或:

template <class T, class A, class F, class R = std::result_of_t<F(T)>>
std::vector<R, A> map(std::vector<T, A> const& v, F f) {
return std::vector<R, A>(
boost::make_transform_iterator(v.begin(), f),
boost::make_transform_iterator(v.end(), f)
);
}

我必须执行 map()分别为每个容器 - 但无论如何我都必须这样做。现在我不会放弃任何东西。此外,您多久编写一次与运行时容器无关的算法?

关于c++ - 与模板成员函数的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37236703/

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