2015-10-31 63 views
1

我是C++新手。在下面的方法中,我试图打印而不返回。没关系。我需要的是我需要返回如下。 (需要用while while循环读取结果)。我知道一旦回来,我们不能回环。问题是一旦结果可用,应在每次迭代中返回结果。 (类似于其他线程运行此循环时一个线程读取结果可用)。我可以使用回调来解决它吗?如何从函数中一次又一次地在C++中返回?

list<string>MyLogRetriever::handleEventsOnEventID(std::string logType, DWORD eventID) 
    { 
     while (GetAsyncKeyState(VK_ESCAPE) != true) 
     { 
      wstring wsLogType = stringToWidestring(logType); 
      LPCWSTR lpcwstrLogType = wsLogType.c_str(); 

      string string_query = ""; 
      string_query = string_query + "*[System/EventID= " + to_string(eventID) + "]"; 
      wstring wsCons = stringToWidestring(string_query); 
      LPCWSTR pwsQuery = wsCons.c_str(); 

      getEvents(lpcwstrLogType, pwsQuery, -1); 
      //printResultedEvent(myLogStructures, numberOfAvailableEvents); 
      return returnResultedEvent(myLogStructures, numberOfAvailableEvents); 
      numberOfAvailableEvents = 0; 
     } 
    } 
+0

您是否真的需要一次返回一个,还是可以获得所有结果并一次返回所有结果?如果C++有生成器(比如Python和C#中的yield),第一种选择会容易得多,尽管MSVC有初始的支持,Clang正在开发它,但它还没有正式发布。 – chris

+0

@chris我需要一次返回一个。结果一次不可用。我可以使用回调来解决它吗? – Veena

+0

如果时间维护平衡对您来说足够好,您可以。 – chris

回答

3

你所要求的是什么类似于generator

在计算机科学中,发电机是可以用来控制循环的迭代行为的特别程序。实际上,所有的生成器都是迭代器。生成器与返回数组的函数非常相似,因为生成器具有参数,可以调用并生成一系列值。但是,不是构建一个包含所有值的数组并立即返回它们,而是一次生成一个值,这需要较少的内存,并允许调用者立即开始处理前几个值。

尽管此功能在其他语言(如Python)中广为人知并得到支持,但C++中还没有官方支持生成器。

作为一种变通方法,你可能想使用一个表,并将其作为参数传递给你的函数同时,各结果追加到它每一次返回它,而不是 - 你可以写一个类的方法next()产生下一个结果积分为Siyuan Ren为此)。

+3

或者用'next()'方法编写一个类以产生下一个结果。 –

+0

@naltipar我认为next()不适合。因为一旦有效就立即需要结果。请考虑我最后一次编辑 – Veena

2

只有一种方法可以从方法返回。如果你想捕获更多的信息,你需要附加到某种结构(例如,一个数组,或其他couplex对象),然后返回。在你的情况下,你会在你的while循环执行之前声明它,并在循环中使用它。或者您可以使用不同的参数多次调用该方法。

+0

我需要一次返回一个。结果一次不可用。我可以使用回调来解决它吗? – Veena

+0

@ naltipar的答案就是你想要的。这个想法是,你需要将该方法封装在一个对象中,以便它可以保持状态,以便下一次调用next()时,它将返回后一个。如果你不把它封装在一个对象中,你将不得不使用我的解决方案的一些变体。 – ergonaut

1

功能在数学上是执行计算并返回结果的构造。函数通常指的是一个二元关系,它对于其域(输入集合)中的每个项目都有一个唯一的映射到它的共域(输出集合)。现在,这些集合元素本身可以被聚合。

我不是其他语言如Java或Python的专家,但我想这也适用于他们。

根据您的使用情况,您可以从该函数返回一个聚合(矢量,地图,set等)作为输出。

+0

我需要一次返回一个。结果一次不可用。我可以使用回调来解决它吗? – Veena

+0

是的。事件驱动的方法是这样做的一种方式 – basav

相关问题