我们有 - 一个模板函数,也是递归的,其中很多东西是从不同的(头)文件中提取的,并且只有一个模板 - 将找到的值写入迭代器。像这样的东西
template<typename Itor>
void terribleFunction(Itor it, type1 param1, type2 param2, ...)
{
// Всякие дела
for(....
{
// И еще дела
// Первое использование it
if(...) terribleFunctiom(it,p1,p2,...);
// И еще...
// Второе использование it
if (...) *it++ = что-то;
// И еще...
}
}
或多或少是这样的。我想尽可能地隐藏所有代码 - 其中没有任何模板 - 无论是在库中还是在单独的文件中 - 通常,至少尽量不要在头文件中产生依赖关系,写出所有代码在里面,尽量把它去掉,变成一些辅助功能,不管。但无论我想出什么 - 都是通过一个不雅的地方......
在这里应用什么棘手的方法,提示? ...
如果唯一的用途是
X x = expr; *it++ = x;
,那么这个操作可以被包裹在 中std::function<void(X)> f
,传递的不是迭代器而是这个函数,使用 asf(x)
。或者你可以传递一个带有虚函数的类。
本质上,您所需要的只是迭代器的多态行为。现在您可以通过模板实现多态性。你可以通过继承和虚方法达到同样的效果。
首先,让我们声明一个迭代器接口:
我想您知道要写入迭代器的值的类型。例如,我拿了
int
.现在我们需要一个特定的实现,以及所有可能的迭代器。是的,再次模板:
现在让我们从 中取出所有代码
void terribleFunction(Itor it)
,将其移动到一个函数void terribleFunctionHelper(IIterator &it)
中,并对迭代器的使用进行一些更改:代码
void terribleFunction(Itor it)
现在将变成这样:由于这些简单的操作,所有依赖项都变成了非模板
terribleFunctionHelper
。您可以安全地将其代码传输到 cpp 文件。完整示例