我正在编写一些算法来构建随机森林,每个森林都将使用单独的函数在单独的数据上进行训练(每棵树将使用一组具有固定签名的函数,但是不同的树将使用不同的函数集进行训练,这些函数可能具有不同的签名),但是我想使用模板编写一次构建随机树的代码。我目前有以下内容:
模板类 T 对应训练数据类型(即图像补丁,或像素) 模板类 V 对应函数指针类型
template<class T, class V>
class RandomTree{
void build(RandomTreeNode<T>& current_node,
vector<V>& functions,
vector<T>& data) {
... some code that basically calls a function passing in data T
}
}
我像这样创建对象:
typedef double (*function_ptr)(TrainingDataPoint& data_point);
RandomTree<TrainingDataPoint, function_ptr> tree = ...
问题是,出于效率原因,对于我正在构建的一棵树,我希望函数集(function_ptr's)不仅包含 TrainingDataPoint(模板类型 T),还包含数据缓存。这样我的函数指针将如下所示:
typedef double (*function_ptr)(TrainingDataPoint&,
unordered_map<string, cv::Mat>& preloaded_images);
现在的问题是,我想不出一种方法来保持 RandomTree 类的通用性,但有一些函数集(模板类型 V)不仅仅需要训练点(模板类型 T)。
到目前为止,我想到了:
- 使缓存全局化,以便函数可以访问它
- 为每个训练数据点添加一个指向缓存的指针(但谁负责清理?)
- 将第三个模板参数添加到 RandomTree,但在这种情况下,如果我正在构建不需要第三个参数的树,我应该放什么?
这些选项似乎都没有对我特别有吸引力,希望有人可以提供一些经验并告诉我更好的方法吗?
谢谢