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>'
解决此错误的最佳方法是什么?
有没有比返回空矢量更好的方法?
答案 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)
修改: (阅读已编辑的问题版本后)
备选方案:
void
并通过引用(或指针)传递给它,然后填充函数体中的向量。boost::shared_ptr<vector<DWORD> >
(或其他smart pointer),构造并填充函数体中的向量(当然在动态内存中),然后返回它的地址或NULL。 / LI>
答案 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;
}