c++ - 使用具有不同参数的函数指针的更好设计

标签 c++ function-pointers

我有一个优化算法,可以找到图形的最佳分区。

有很多衡量分区质量(被优化的变量)的方法,所以我认为使用指向这些质量函数的函数指针并将其传递到我的优化算法函数中是个好主意。

这工作正常,但问题是不同的质量函数采用一些不同的参数。

例如,一个质量函数是 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 参数。当然,我可以将它作为一个参数包含进来,而不是在函数中使用它,但这似乎是一种不好的做法,而且一旦我开始添加许多不同质量的函数就会变得笨拙。

对于这种情况,更好的设计是什么?

最佳答案

使用函数对象。这些函数对象之一可以有一个传递给构造函数的 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);
    ...
}

关于c++ - 使用具有不同参数的函数指针的更好设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4683585/

相关文章:

c++ - Linux 和剪贴板

c++ - SWIG 相当于存储一个 boost::python::object

c++ - 函数指针 - 类的内部和外部

C中函数指针typedef的循环引用

c++ - 指向函数的模板指针的部分模板特化

c++ - QTcpSocket 的 QThread 没有发出完成信号

c++ - 我可以静态断言一个实体是模板类的实例,而不强制执行任何/所有模板参数吗?

c++ - 指向 deque<int>::push_back 的指针

C 链表使用指针removeLast

c++ - 如何在不使用套接字的情况下在 C++ 中发送 POST 请求