与模板成员函数的接口
Interface with template member function
我有兴趣为C++实现一个类似Java集合的环境。我知道这不是一个好主意,等等,但我以后真的不想使用它,只是学习如何做一些高级OOP。
我的问题是我想要一个具有纯虚拟函数的基类模板collection<T>
。这些函数中的一个应该是map()
,它采用std::function<R(T)>
。由于map()
应该是虚拟的,我不知道应该使用哪种返回类型。collection<R>
不可能,因为成员函数模板不能是虚拟的。
如何为我的collection<T>
接口添加这样的map()
成员函数?
如何为我的
collection<T>
接口添加这样的map
成员函数?
简短的回答是:你没有。如果我有一些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>>>
。只要做大量的工作,完全无视性能和类型安全,你就可以做到这一点。
这就是模板的优点。如果我想为vector
这样的东西写map
,我可以写:
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()
,但无论如何我都必须这样做。现在我不会放弃任何东西。此外,您多久编写一次与运行时容器无关的算法?
将map
实现为外部模板函数。例如,您可以将map
分解为两个阶段,内部虚拟生产者和外部模板消费者。
template<typename T> struct Collection {
// virtual T next(); // Java way
// C++ way
// In simplest cases you can rely on iterator pairs.
struct const_iterator {
T const &operator*() const;
const_iterator &operator++();
}
virtual const_iterator begin() const;
virtual const_iterator end() const;
};
template<typename R, typename T> Collection<R> map(
Collection<T> const &coll, std::function<R(T)> const &f);
要实现本质上复杂的容器和一元组合,您甚至可以拒绝begin()
和end()
,并编写显式(部分)模板专用化。
- 内联如何影响模块接口中的成员函数
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- unique_ptr实现接口时对已删除函数的引用
- 在多个头文件中从接口声明被覆盖的函数时,如何避免重复代码?
- 如何通过接口将函子分配给函数对象
- 如何创建一个接口,允许我访问C++中的按钮(和其他ui)函数,该函数是使用python中的MFC实现的
- C++接口的工厂函数实现
- 对已定义的接口析构函数的未定义引用
- 必须具有泛型接口的函数,但必须根据传递的子类(不知道它们是什么!)以不同的行为 - C++
- 在构造函数处将类对象强制转换为接口始终返回 NULL
- 在接口文件中使用模板时出现"not a type"错误的函数指针
- 从 COM 接口中的函数返回多个值
- 为什么在将多态行为与指向接口的指针一起使用时没有调用析构函数?
- 从多个不同的实现类 c++ 调用接口函数
- Clean方法来调用具有对象向量的接口函数
- 如何正确调用此CGAL的QT接口函数?
- 传递函数接口函数的指针
- 如果您有一个调用其他内部函数的类接口函数
- Opencv c++到C接口函数的转换
- 从未知的派生类调用接口函数(多重继承)