我有一个优化算法,可以找到图的最佳分区。
分区的质量有许多度量(变量被优化),所以我认为使用指向这些质量函数的函数指针,并将其传递到我的优化算法函数中是一个好主意。
这很好用,但问题是不同的质量函数采用一些不同的参数。
例如,一个质量函数是find_linearised_stability,它需要一个markov_time参数:
float find_linearised_stability(cliques::Graph<T> &my_graph, cliques::Partition &my_partition,
std::vector<float> &markov_times, std::vector<float> &stabilities)并在优化函数中使用:
cliques::find_optimal_partition_louvain(my_new_graph, markov_times, &cliques::find_linearised_stability);然而,另一个质量函数find_modularity不需要markov_time参数。当然,我可以只将它作为参数,而不在函数中使用它,但这似乎是一种糟糕的做法,而且一旦我开始添加许多不同质量的函数,它就会变得笨拙。
对于这种情况,什么是更好的设计?
发布于 2011-01-14 02:24:11
使用函数对象。其中一个函数对象可以有一个传入构造函数的markov_time成员:
struct find_linearised_stability {
std::vector<float> & markov_times_;
find_linearised_stability(std::vector<float> & markov_times)
:markov_times_(markov_times)
{}
float operator () (cliques::Graph<T> &my_graph, cliques::Partition &my_partition,
std::vector<float> &stabilities)
{
// use markov_times_ in here, we didn't need to pass it since it's a member
}
};(您可能需要对一致性/参考性进行调整以满足您的需求)
然后你可以像这样调用你的函数:
cliques::find_optimal_partition_louvain(my_new_graph, cliques::find_linearised_stability(markov_times));“声明函数时,应使用函数对象的哪种类型?”
使其成为以函数对象类型作为模板参数的函数模板,如下所示:
template<typename PR>
whatever find_optimal_partition_louvain(my_new_graph, PR & pr)
{
...
pr(my_new_graph, partition, stabilities);
...
}发布于 2011-01-14 02:20:03
您唯一的选择是boost::bind或类似它的东西,存储在一个boost::函数或类似的东西中。
如果分析显示太慢,那么你将被困在“糟糕的实践”版本中,因为任何替代方案都将与UB发生冲突,并且/或者最终与更合理的替代方案一样“慢”。
https://stackoverflow.com/questions/4683585
复制相似问题