【发布时间】:2023-03-08 07:16:01
【问题描述】:
我想知道在 C++ 中传递多个函数参数的最佳做法是什么。我想遵循在 STL 中看到的适当的通用设计原则。
我有一个通用算法函数。使用模板,它允许客户端选择将用于运行算法的数据结构以及将从哪个容器实现中提取数据。但是,为了使其可重用,我选择了一些应插入客户端设计代码的位置。
template<class CustomContainerIterator, class Queue, class Element>
void run_generic_algorithm(CustomContainerIterator container,
std::function<void(Element)> client_code1,
std::function<void(Element)> client_code2,
std::function<void(Element)> client_code3)
{
Queue queue;
//Push things iterated through onto the queue
Element queue_element = queue.top();
client_code1(queue_element);
// Run code modifying queue
client_code2(queue_element);
// Run code modifying queue
client_code3(queue_element);
}
client_code() 函数由客户端指定,并且可以修改客户端拥有的相同变量。在我的代码中,有 5 个客户端函数。我最初将它们全部作为 lambda 表达式传递并捕获了我想要修改的客户端变量。但是,这会导致非常冗长的函数调用。
大多数时候我什至没有指定所有客户端函数,所以我必须放入一个什么都不做的 lambda 函数。有没有更好的方法来实现我想要的。我想坚持正确的通用编程原则吗?
好的,我已经阅读了答案。我可以结合这样的想法吗?现在我觉得我不需要虚函数了。
template <typename Element>
struct Customization {
void client_code1(Element) {}
void client_code2(Element) {}
void client_code3(Element) {}
void client_code4(Foo) {}
void client_code5(Bar) {}
};
template <typename Element>
struct Implementation : public Customization {
Data some_data;
void client_code2(Element) {
//Fill some_data with information.
}
};
template<class Queue, class CustomContainerIterator, class CustomImplementation>
void run_generic_algorithm(CustomContainerIterator container,
CustomImplementation implementation)
{
Queue queue;
//Push things iterated through onto the queue
auto queue_element = queue.top();
implementation.client_code1(queue_element);
// Run code modifying queue
implementation.client_code2(queue_element);
// Run code modifying queue
implementation.client_code3(queue_element);
}
有用法
std::vector<int> v;
Implementation <int> custom;
run_generic_algorithm<std::queue<int>>(v, custom);
【问题讨论】:
-
如果你想遵循 stl 那么你的方法应该使用迭代器而不是容器。关于客户端功能,您应该显示代码而不是用文字描述它
-
你是对的。我在写这篇文章时犯了一个错误。实际代码确实将迭代器带到自定义容器。
-
恕我直言,您将代码简化得太多了。该方法不使用其参数,并且
queue_element或client_code的来源并不明显 -
pop返回void无论如何queue在那一点上是空的 -
为什么队列会是空的?我只弹出了一个元素。
标签: c++ templates lambda generic-programming