在这种情况下如何/返回什么?

时间:2011-06-23 08:45:04

标签: c++ stl coding-style

CODE:

vector<DWORD> get_running_proc_list()
{
    DWORD proc_list[1024], size;

    if(!EnumProcesses(proc_list, sizeof(proc_list), &size))
    {
        return 0; // PROBLEM HERE!! 
    }

    vector<DWORD> _procs(proc_list, proc_list + size/sizeof(DWORD));
    return _procs;
}

错误:

cannot convert from 'int' to 'const std::vector<_Ty>'

解决此错误的最佳方法是什么?
有没有比返回空矢量更好的方法?

7 个答案:

答案 0 :(得分:4)

好吧,你的函数返回vector,而不是DWORD。你不能只返回一个空的向量:

return std::vector< DWORD >();

return std::vector< DWORD >( 1, 0 );

如果你真的需要0


修改

还有另一种选择,如果空向量不是解决方案(如果它是某种有效值,你需要知道) - 使用异常。您可以创建自己的异常类或使用一些标准类。所以,你可以这样做:

if(!EnumProcesses(proc_list, sizeof(proc_list), &size))
{
   throw MyException( "some message, if you want" );
}

如果您选择此选项,我建议您继承std::exception

或者,在这种情况下,您可以返回指向std::vector的指针并返回NULL。但我会推荐这个。但这只是我的意见。

答案 1 :(得分:3)

抛出异常。这就是他们的目的。毕竟,肯定应该有一个正在运行的进程列表。

绝对不会因价值或其他原因而失败。在这种情况下,RVO / NRVO可以轻松应用。我的意思是,在最坏的情况下,你可以互换。

答案 2 :(得分:2)

修改: (阅读已编辑的问题版本后)

备选方案:

  1. 您可以让函数返回void并通过引用(或指针)传递给它,然后填充函数体中的向量。
  2. 您可以让函数返回boost::shared_ptr<vector<DWORD> >(或其他smart pointer),构造并填充函数体中的向量(当然在动态内存中),然后返回它的地址或NULL。 / LI>
  3. 如果上述解决方案不合适,请抛出异常。

答案 3 :(得分:1)

if(!EnumProcesses(proc_list, sizeof(proc_list), &size))
{
  vector<DWORD> empty;       
  return empty;  <--- 0 sized vector
}

您可以返回空的vector<>

作为旁注,我不建议按价值 vector 返回。而是将vector<>作为参数传递,以确保不会发生不必要的副本。

void get_running_proc_list(vector<DWORD> &_procs) pass by reference and populate
{
...
}

答案 4 :(得分:1)

替换

return 0; // PROBLEM HERE!!  

return vector<DWORD>(); // NO PROBLEM!!  

答案 5 :(得分:1)

boost::optional怎么样?它将指针语义添加到普通对象,并允许它们设置或不设置,无需动态分配。

#include <boost/optional.hpp>

typedef boost::optional<std::vector<DWORD>> vec_opt;

vec_opt get_running_proc_list()
{
    DWORD proc_list[1024], size;

    if(!EnumProcesses(proc_list, sizeof(proc_list), &size))
    {
        return 0; 
    }

    vector<DWORD> _procs(proc_list, proc_list + size/sizeof(DWORD));
    return _procs;
}

这就是你需要做的,只需更改返回类型即可。在通话网站上:

vec_opt v = get_running_proc_list();
if(v){
  // successful and you can now go through the vector, accessing it with *v
  vector<DWORD>& the_v = *v;
  // use the_v ...
}

答案 6 :(得分:0)

您正在尝试返回两个逻辑上不同的信息:首先,“进程列表是什么?”第二,“我可以计算进程列表吗?”。我建议你用两个不同的变量返回它们:

// UNTESTED
bool get_running_proc_list(vector<DWORD>& result)
{
  DWORD proc_list[1024], size;

  if(!EnumProcesses(proc_list, sizeof(proc_list), &size))
  {
    return false; 
  }

  result = vector<DWORD>(proc_list, proc_list + size/sizeof(DWORD));
  return true;
}

但是,我可能会尝试保存一对memcpy

// UNTESTED
bool get_running_proc_list(vector<DWORD>& result)
{
  result.clear();
  result.resize(1024);

  DWORD size;
  if(!EnumProcesses(&result[0], result.size()*sizeof(DWORD), &size))
  {
    result.clear();
    return false; 
  }
  result.resize(size/sizeof(DWORD));

  return true;
}