小编MSa*_*ers的帖子

确定std :: function的返回类型

我正在编写一个接收std::function对象的模板函数(通过std::bind使用正确的参数调用生成).在这个函数中,我想确定这个函数对象的返回类型.有可能吗?

事实上,我希望模板函数返回相同的类型.你能想到一个优雅的,基于标准的,实现这一目标的方式吗?

就像是:

template <typename T>
T::return_type functionObjWrapper(T functionObject) {
   // ...
   return functionObject();
}
Run Code Online (Sandbox Code Playgroud)

谢谢

c++ templates c++11

4
推荐指数
2
解决办法
2326
查看次数

Secure C和大学 - 接受过缓冲区溢出培训

我最近在C完成了大学课程.所以我当然缺乏经验.

一些大学倾向于教他们的学生安全编程,或至少一些元素.还有,即使视频(摘自这里).

在C中,复制字符串,据我所知 - strcpy或string.h函数.如何在日常编程中安全地使用它?你有一些函数,它们处理分配以防止缓冲区溢出?有CCERT安全编码标准.它提供示例和合规解决方案:

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)

从这里开始,第二个例子.

但据我所知,这更具挑战性,更多代码,更多工作.为什么没有人改变图书馆本身?或者至少为什么没有人提供安全的替代库或功能,以正确的方式处理这个?

感谢阅读,愿

c security buffer-overflow

3
推荐指数
1
解决办法
788
查看次数

使用迭代器走路和解散std :: vector最干净的方法是什么?

我有一种情况,我正在通过矢量,行事:

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进行比较. …

c++ iterator loops for-loop vector

3
推荐指数
1
解决办法
2215
查看次数

Qwidget,如何在光标下突出显示小部件

我在QT中创建了一些QLabel类型的小部件,并将其添加到QToolbar中.我想突出显示光标下的特定小部件.我无法理解我该怎么做.有人可以帮忙吗?我在QT 4上需要这些信息.

谢谢.

c++ qt

3
推荐指数
1
解决办法
6998
查看次数

C++ - 我们为什么要在这个构造函数中使用explicit?

请参考维基百科:策略模式(C++)

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是一个好习惯?

谢谢

c++ explicit-constructor

3
推荐指数
2
解决办法
2510
查看次数

使用前导零反转一个数字

我们如何使用前导零数来反转数字?例如:如果输入为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.所以我想,我会采用字符串方法.希望面试官会很开心:)

c++

3
推荐指数
2
解决办法
1万
查看次数

为什么/ Qvec-report:2什么都不返回?(MSVC 2012)

我尝试了/ 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)

visual-c++

3
推荐指数
1
解决办法
846
查看次数

如果头文件被更改然后还原,如何停止/欺骗cmake不重建?

如果我不小心更改了头文件,保存它,然后将其更改回来并重新保存,如何阻止cmake检测到更改并重建其所有依赖项.通常我甚至不知道它在我重新运行之后才被修改make并开始重建过程.

我尝试了一些天真的手动时间戳更改,但没有运气.

要清楚,我正在寻找一个能够解释cmake使用规则的黑客或者某人.使用命令行gcc/clang,环境是linux/os x.

c++ makefile cmake

3
推荐指数
1
解决办法
521
查看次数

WINAPI.无法用椭圆擦除窗口的背景

我只是想绘制一个椭圆:

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++ winapi

3
推荐指数
1
解决办法
144
查看次数

在两个整数之间交换最右边的N位

在现场C++编码访谈期间询问了这个问题.在那次采访中我没有提供一个好的答案.所以我希望在堆栈溢出时得到人们的反馈和建议.现在我已经有更多的时间来提出解决方案了,我相信我写了一个不错的解决方案.我认为这可以正常工作ab引用不同的整数.如果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)

c++ bit-manipulation

3
推荐指数
1
解决办法
95
查看次数