我正在编写一个接收std::function对象的模板函数(通过std::bind使用正确的参数调用生成).在这个函数中,我想确定这个函数对象的返回类型.有可能吗?
事实上,我希望模板函数返回相同的类型.你能想到一个优雅的,基于标准的,实现这一目标的方式吗?
就像是:
template <typename T>
T::return_type functionObjWrapper(T functionObject) {
// ...
return functionObject();
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我最近在C完成了大学课程.所以我当然缺乏经验.
一些大学倾向于教他们的学生安全编程,或至少一些元素.还有,即使视频(摘自这里).
在C中,复制字符串,据我所知 - strcpy或string.h函数.如何在日常编程中安全地使用它?你有一些函数,它们处理分配以防止缓冲区溢出?有C的CERT安全编码标准.它提供示例和合规解决方案:
int main(int argc, char *argv[]) {
/* ... */
char prog_name[128];
strcpy(prog_name, argv[0]);
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
他们的替代方案是:
int main(int argc, char *argv[]) {
/* ... */
char *prog_name = (char *)malloc(strlen(argv[0])+1);
if (prog_name != NULL) {
strcpy(prog_name, argv[0]);
}
else {
/* Couldn't get the memory - recover */
}
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
从这里开始,第二个例子.
但据我所知,这更具挑战性,更多代码,更多工作.为什么没有人改变图书馆本身?或者至少为什么没有人提供安全的替代库或功能,以正确的方式处理这个?
感谢阅读,愿
我有一种情况,我正在通过矢量,行事:
std::vector::iterator iter = my_list.begin();
for ( ; iter != my_list.end(); ++iter )
{
if ( iter->doStuff() ) // returns true if successful, false o/w
{
// Keep going...
}
else
{
for ( ; iter != m_list.begin(); --iter ) // ...This won't work...
{
iter->undoStuff();
}
}
}
在正常情况下 - 假设一切顺利 - 我一路前进my_list.end()并成功结束循环.
但是,如果在我做某事时出现问题,我希望能够撤消所有内容 - 基本上将我的步骤回溯到向量的开头,一次一个地以相反的顺序撤消所有内容.
我的问题是,当我到达my_list.begin()- 如嵌套for循环中所示 - 我还没有完成,因为我仍然需要调用undoStuff()列表中的第一个元素.现在,我可以在循环之外进行最后的调用,但这看起来有点不洁净.
我看到它的方式,我只有在我到达时才会这样做my_list.rend().但是,我无法将std :: vector :: iterator与std :: vector :: reverse_iterator进行比较. …
我在QT中创建了一些QLabel类型的小部件,并将其添加到QToolbar中.我想突出显示光标下的特定小部件.我无法理解我该怎么做.有人可以帮忙吗?我在QT 4上需要这些信息.
谢谢.
class Context
{
private:
StrategyInterface * strategy_;
public:
explicit Context(StrategyInterface *strategy):strategy_(strategy)
{
}
void set_strategy(StrategyInterface *strategy)
{
strategy_ = strategy;
}
void execute() const
{
strategy_->execute();
}
};
Run Code Online (Sandbox Code Playgroud)
为什么在Context的构造函数中使用explicit是一个好习惯?
谢谢
我们如何使用前导零数来反转数字?例如:如果输入为004,则输出应为400.
我写下面的程序,但只有在输入中没有前导零时它才有效.
int num;
cout<<"Enter number "<<endl;
cin>>num;
int rev = 0;
int reminder;
while(num != 0)
{
reminder = num % 10;
rev = rev * 10 + reminder;
num = num / 10;
}
cout<<"Reverse = "<<rev<<endl;
Run Code Online (Sandbox Code Playgroud)
有没有办法输入带前导零的数字?即便如此,Above逻辑对这些数字也不起作用.
有什么简单的解决 将输入作为字符串并处理它是可行的.但那看起来并不好看.
*编辑:如果已知数字长度,则可以使用前导零反转数字.(不使用字符串)*
我会尽快发布代码.
编辑2:我试图将字符放回到cin流,然后读取并计算反向.它适用于2位数字.
但如果已知长度,则更容易找到反向.我需要做的就是,按所需的次数乘以10.所以我想,我会采用字符串方法.希望面试官会很开心:)
我尝试了/ Qvec-report:2选项来查看MSVC自动矢量化器是否有用.不幸的是,我没有得到任何结果,积极或消极:
> Microsoft (R) C/C++ Optimizing Compiler Version 17.00.60610.1 for x86
1> Copyright (C) Microsoft Corporation. All rights reserved.
1>
1> cl /c /Zi /nologo- /W3 /WX- /O2 /Ob2 /Oi /Oy /GL /D WIN32 /D _SCL_SECURE_NO_WARNINGS /D _CRT_SECURE_NO_WARNINGS /D NDEBUG /D _LIB /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /Gy /arch:SSE2 /fp:fast /Zc:wchar_t /Zc:forScope /Yu"stdafx.h" /Fp"Release\(redacted).pch" /Fo"Release\\" /Fd"Release\vc110.pdb" /Gd /TP /analyze- /errorReport:prompt /Qvec-report:2 (redacted).cpp
1>cl : Command line warning D9035: option 'nologo-' has been deprecated and will be …Run Code Online (Sandbox Code Playgroud) 如果我不小心更改了头文件,保存它,然后将其更改回来并重新保存,如何阻止cmake检测到更改并重建其所有依赖项.通常我甚至不知道它在我重新运行之后才被修改make并开始重建过程.
我尝试了一些天真的手动时间戳更改,但没有运气.
要清楚,我正在寻找一个能够解释cmake使用规则的黑客或者某人.使用命令行gcc/clang,环境是linux/os x.
我只是想绘制一个椭圆:
case WM_PAINT:
hdc = BeginPaint(parentWindow, &ps);
Ellipse(hdc, x, y, width, height);
EndPaint(parentWindow, &ps);
Run Code Online (Sandbox Code Playgroud)
,然后使用计时器每秒绘制一个带有一些新参数的新椭圆来擦除它:
case WM_CREATE:
SetTimer(hWnd, 1, 1000, NULL);
break;
case WM_TIMER:
x += 5;
InvalidateRect(hWnd, NULL, TRUE);
break;
Run Code Online (Sandbox Code Playgroud)
但椭圆不会被删除和分层:
但是,我试图跟踪WM_ERASEBKGND,它确实是每个InvalidateRect发送的.
完整代码:
#include <Windows.h>
#include <windowsx.h>
#include <tchar.h>
#include <iostream>
TCHAR szWindowClass[] = TEXT("CreateThreadWindow");
TCHAR szAppName[] = TEXT("CreateThreadExample");
BOOL InitWindow(HINSTANCE, int);
ATOM MyRegisterClass(HINSTANCE);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HWND parentWindow;
MSG msg;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MyRegisterClass(hInstance);
if (!InitWindow(hInstance, nCmdShow)) …Run Code Online (Sandbox Code Playgroud) 在现场C++编码访谈期间询问了这个问题.在那次采访中我没有提供一个好的答案.所以我希望在堆栈溢出时得到人们的反馈和建议.现在我已经有更多的时间来提出解决方案了,我相信我写了一个不错的解决方案.我认为这可以正常工作a并b引用不同的整数.如果a并且b引用相同的整数,那么该整数将被破坏为0.
void SwapRightMostNBits(int& a, int& b, unsigned int n){
if (n>31) { n=31; }
int mask=static_cast<int>(pow(2,n)-1);
a ^= (b & mask);
b ^= (a & mask);
a ^= (b & mask);
}
Run Code Online (Sandbox Code Playgroud)