gpt4 book ai didi

c++ - 我应该以及如何在 C++ 中的计算要求高的算法中创建进度报告

转载 作者:行者123 更新时间:2023-11-30 02:56:39 25 4
gpt4 key购买 nike

我正在实现一些深度学习神经网络,而 Matlab 的现有代码通常只是打印到控制台,以便用户了解进度。

当我为 C++ 进行设计并将算法的核心部分放入单独的函数中时,我不想将内容打印到控制台,是否有一些方法或设计原则可以为使用的用户留下一个选项获得某种进度指示的算法?

能否让可选参数成为人们可以 Hook 的函数指针,或者我该怎么做?

void my_heavy_algorithm(int * data, int n,...);

最佳答案

如果您将算法公开为函数集合,那么方法是让其中一个参数成为具有如下签名的函数指针:

void (*reportProgress)(void*, int)

但是如果您使用 C++ 设计算法,您可能应该利用封装并为您的算法创建一个类(或一组类)。在这种情况下,您不希望将函数指针作为参数添加到各个函数。

相反,您可以使函数指针成为您的类的成员。并具有访问器方法来获取/设置它。或者更好的是,提供一个用于报告进度的抽象类。

class ProgressReporter
{
public:
virtual ~ProgressReporter() = 0;
virtual void notifyProgressChanged(void* source, int progressValue) = 0;
}

class Algo
{
private:
ProgressReporter* _userProvidedReporter = NULL;

public:
void set_ProgressReporter(ProgressReporter*); // set accessor
ProgressReporter* get_ProgressReporter(); // get accessor
void my_heavy_algorithm(int*, int, ...); // your algo. implementation fn.
}

void Algo::set_ProgressReporter(ProgressReporter* reporter){
_userProvidedReporter = reporter;
}

ProgressReporter* Algo::get_ProgressReporter(){
return _userProvidedReporter;
}

void Algo::my_heavy_algorithm(int * data, int n,...){

// do stuff

if(_userProvidedReporter != NULL)
_userProvidedReporter->notifyProgressChanged((void*)this, currentProgress);

// do more stuff

if(_userProvidedReporter != NULL)
_userProvidedReporter->notifyProgressChanged((void*)this, currentProgress);

// so on and so forth..
}

当然,上面是一个非常简单的例子。如果您希望您的算法支持并发,您应该同步对内部用户报告器的访问,并且您可以考虑为您的算法创建一个基类并提供具体的派生实现。

关于c++ - 我应该以及如何在 C++ 中的计算要求高的算法中创建进度报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15298458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com