我正在阅读一些与线程相关的代码,并发现了这段代码:
MyThread::start()
{
//Create a thread
m_pThread = AfxBeginThread(/*some parameters*/)
//Create a duplicate handle for the created thread
m_hDuplicateHandle = DuplicateHandle(/* some more parameters*/)
}
MyThread::stop()
{
//Set some variables so that the thread comes out of its run() function
WaitForSingleObject(m_hDuplicateHandle, defaultTimeout);
CloseHandle(m_hDuplicateHandle);
}
Run Code Online (Sandbox Code Playgroud)
我的问题,为什么需要重复的句柄?我们不能直接等待原来的线程句柄吗?它以某种方式变得无效吗?
我有一个包含大量元素的向量.现在我想编写一个小函数来计算向量中偶数或奇数元素的数量.由于性能是一个主要问题,我不想在循环中放入if语句.所以我写了两个小函数,如:
long long countOdd(const std::vector<int>& v)
{
long long count = 0;
const int size = v.size();
for(int i = 0; i < size; ++i)
{
if(v[i] & 1)
{
++count;
}
}
return count;
}
long long countEven(const std::vector<int>& v)
{
long long count = 0;
const int size = v.size();
for(int i = 0; i < size; ++i)
{
if(0 == (v[i] & 1))
{
++count;
}
}
return count;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我可以通过编写这样的单个模板函数来获得相同的结果:
template <bool countEven>
long long countTemplate(const …Run Code Online (Sandbox Code Playgroud) 我有一个像这样的简单类:
class A
{
public:
void f(const int& n)
{
std::cout<<"A::f()" << n <<"\n";
}
};
Run Code Online (Sandbox Code Playgroud)
我试图像这样使用它:
std::vector<A> vec;
A a;
vec.push_back(a);
std::for_each(vec.begin(), vec.end(), std::bind2nd(std::mem_fun_ref(&A::f), 9));
Run Code Online (Sandbox Code Playgroud)
但是当我编译代码时,我在函数头文件中的某处得到以下错误:
错误C2529:'_ Right':对引用的引用是非法的
如果我删除参数f()中的引用,它编译正常.我该如何解决这个问题?我不想删除引用,因为在我的实际代码中复制对象是非常昂贵的.另外,我没有使用提升.
我正在尝试编写一个模板函数,它将从给定的字符串中提取给定数据类型的值.我提出了这样的事情:
template<class T>
static T getValue(const CString& val_in)
{
std::wstring value = val_in;
std::istringstream iss;
iss.str(value);
T val = T();
iss>>val;
return val;
}
Run Code Online (Sandbox Code Playgroud)
但是这会给iss.str(value)语句带来以下错误.
错误C2664:'void std :: basic_istringstream <_Elem,_Traits,_Alloc> :: str(const std :: basic_string <_Elem,_Traits,_Ax>&)':无法将参数1从'std :: wstring'转换为'const std :: basic_string <_Elem,_Traits,_Ax>&'
所以基本上std::istringstream只接受std::string.我以为可能有一个,std::wistringstream但似乎没有一个可用.任何线索我该怎么办?
我试图用来GetGuiResources找到我的程序使用的Gui资源.它将一个标志作为第二个参数.我想知道的区别GR_USEROBJECTS和GR_GDIOBJECTS.我找不到任何关于它的文档.谁能解释一下它们之间有什么区别?我也知道默认情况下,一次最多可以打开10k GDI句柄.返回的值是否GR_GDIOBJECTS计入此10k限制的一部分?
哪个是验证传递给函数的输入的最佳方法,即在继续执行某些操作之前验证所有输入
class A;
void fun(A* p)
{
if(! p)
{
return;
}
B* pB = p->getB();
if(! pB)
{
return;
}
.......
}
Run Code Online (Sandbox Code Playgroud)
或者你这样写:
void fun(A* p)
{
if(p)
{
B* pB = p->getB();
if(pB)
{
.....
}
}
}
Run Code Online (Sandbox Code Playgroud)
我问这个是因为,如果我使用第一种风格,那么我的代码中会有多个返回语句,很多人说这些语句很糟糕(不知道为什么),如果我使用第二种风格则会有太多级别嵌套在我的代码中.
有没有人知道任何可用于C++的免费IntelliSense工具,它至少是Visual Assist X功能的50%(当然不是免费的)?基本上我希望我的intellisense工作而不加载我的完整工作区/解决方案?我见过Visual Assist,它提供了这个功能.
我有一个巨大的二进制文件,是2148181087字节(> 2GB)
我正在努力,但fopen (file, "r")它失败了
无法打开:xyz文件(值太大,无法存储在数据类型中)
当文件大小> 2gb时,我在手册页上看到EOVERFLOW错误.
奇怪的是,我使用了一个不同的输入文件,它"几乎"与第一个文件2142884400字节(也是> 2gb)一样大,fopen可以正常工作.
文件大小是否有任何截止,fopen或者有没有其他方法可以解决这个问题?
我是新手,并试图编写一些简单的程序来理解它.在下面的代码中,我试图用随机数填充数组.这是我的代码:
using namespace boost::lambda;
srand(time(NULL));
boost::array<int,100> a;
std::for_each(a.begin(), a.end(), _1=rand());
Run Code Online (Sandbox Code Playgroud)
但它看起来rand()只被评估一次,我的数组包含每个元素的相同值.任何人都可以指出这段代码有什么问题吗?
这个问题与这个问题有关.以下代码编译精细的VC9编译器,但在与Comeau在线编译时给出错误.任何人都可以告诉我哪一个是正确的,错误是什么意思?
错误:暧昧"?" 操作:类型"TypesafeBool"的第二个操作数可以转换为第三个操作数类型"bool",反之亦然TypesafeBool b =(1 == 1)?f():false;
class TypesafeBool
{
private:
bool m_bValue;
struct Bool_ {
int m_nValue;
};
typedef int Bool_::* bool_;
inline bool_ True() const { return &Bool_::m_nValue; }
inline bool_ False() const { return 0; }
public:
TypesafeBool( const bool bValue ) : m_bValue( bValue ){}
operator bool_() const { return m_bValue ? True() : False(); }
};
TypesafeBool f()
{
return TypesafeBool(true);
}
int main()
{
TypesafeBool b = (1==1) ? f() : false; …Run Code Online (Sandbox Code Playgroud) c++ ×9
mfc ×2
stl ×2
winapi ×2
boost ×1
boost-lambda ×1
c ×1
coding-style ×1
fopen ×1
ide ×1
intellisense ×1
stream ×1
templates ×1
win32gui ×1