小编nik*_*ack的帖子

解析二进制文件.什么是现代方式?

我有一个二进制文件,我知道一些布局.例如,让格式如下:

  • 2个字节(无符号短) - 字符串的长度
  • 5个字节(5个字符) - 字符串 - 一些id名称
  • 4个字节(unsigned int) - 一个步幅
  • 24个字节(6个浮点数 - 每个3个浮点数的2个步长) - 浮点数据

该文件应该看起来像(为了便于阅读,我添加了空格):

5 hello 3 0.0 0.1 0.2 -0.3 -0.4 -0.5
Run Code Online (Sandbox Code Playgroud)

这里5 - 是2个字节:0x05 0x00."你好" - 5个字节,依此类推.

现在我想读这个文件.目前我这样做:

  • 将文件加载到ifstream
  • 读这个流到 char buffer[2]
  • 把它变成无符号的短语:unsigned short len{ *((unsigned short*)buffer) };.现在我有一个字符串的长度.
  • 读取流vector<char>std::string从此向量创建一个.现在我有字符串ID.
  • 以相同的方式读取接下来的4个字节并将它们转换为unsigned int.现在我有一个进步.
  • 虽然不是文件结尾读取浮动的方式相同 - 为每个浮点数创建一个char bufferFloat[4]和转换*((float*)bufferFloat).

这有效,但对我来说它看起来很难看.我可以直接读取unsigned shortfloatstring等没有char [x]创造?如果不是,那么正确投射的方法是什么(我读过我正在使用的那种风格 - 是旧风格)?

PS:当我写一个问题时,我头脑中提出的解释越清晰 - 如何从任意位置投出任意数量的字节char …

c++ binary casting

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

嵌套类模板专门化

一类:

template<typename C, typename T>
class A
{
    template <typename U>
    class Nested{};

    Nested<T> n;
};
Run Code Online (Sandbox Code Playgroud)

我想专攻Nested.这是我尝试过的:

template<typename C, typename T>
class A
{
    template <typename U>
    class Nested{};

    template <>
    class Nested<int>{}; // by my logic this should work by I have a compilation error "explicit specialization in non-namespace scope 'class A<C, T>'"

    Nested<T> n;
};
Run Code Online (Sandbox Code Playgroud)

我的下一次尝试:

template<typename C, typename T>
class A
{
    template <typename U>
    class Nested{};

    Nested<T> n;
};

template<>
A<>::Nested<int>{}; // What is …
Run Code Online (Sandbox Code Playgroud)

c++ templates template-specialization

17
推荐指数
1
解决办法
4118
查看次数

智能指针删除和"使用"关键字,名称为"指针"

有时候我看到这样的代码:

void* Create()
{
    int* t{new int{10}};
    return t;
}

class Deleter
{
    //uncomment in order to compile
    //using pointer = void*;
public:
    void operator()(void* t)
    {
        delete t;
    }
};

unique_ptr<int, Deleter> ptr{Create()};
Run Code Online (Sandbox Code Playgroud)

它没有编译.使用VS2013,它说:

错误:C2440:'初始化':无法从'initializer-list'转换为'std :: unique_ptr'没有构造函数可以采用源类型,或构造函数重载解析不明确

但如果我取消注释using pointer = void*;它的工作原理!此外,如果我将别名更改为不同于pointer我得到相同错误的名称.所以似乎拥有一个using具有确切名称的指令pointer是至关重要的.但为什么?我找不到任何解释.

c++ smart-pointers

8
推荐指数
1
解决办法
191
查看次数

"解决之前被篡改"意味着文件解析?

我正在尝试将main流合并到development流,并且需要解析一些文件.解决方法我有一个错误:

文件路径在解析之前被篡改 - 编辑或还原.

我试图像这里描述的那样解决它,但没有成功.这是verify命令告诉我的:

目标文件
路径 - 分支更改9070(文本)A3269695246A89D21F341D8A5BB70B5B

for source
filepath - edit change 22793(text)171BA2F3E0FFCEF3F7A34FDB7A2CEF69
filepath - add change 9049(text)A3269695246A89D21F341D8A5BB70B5B

什么branch change,edit change,add change是什么意思?为什么MD5相同但我仍然有错误?怎么解决?

perforce

8
推荐指数
2
解决办法
7201
查看次数

如何获取成员函数的字符串表示?

作为散列的一部分,我需要将函数指针转换为字符串表示.使用全局/静态函数,它是微不足道的:

string s1{ to_string(reinterpret_cast<uintptr_t>(&global)) };
Run Code Online (Sandbox Code Playgroud)

这里:

2)任何指针都可以转换为足够大的任何整数类型来保存指针的值(例如std::uintptr_t)

但我的成员函数有问题:

cout << &MyStruct::member;
Run Code Online (Sandbox Code Playgroud)

1虽然在调试器中输出我可以看到地址.

string s{ to_string(reinterpret_cast<uintptr_t>(&MyStruct::member)) };
Run Code Online (Sandbox Code Playgroud)

给出编译时错误cannot convert.所以似乎没有任何指针可以转换.

我还能做些什么来获得字符串表示?

c++ casting function-pointers

8
推荐指数
1
解决办法
433
查看次数

.natvis - 如何引用模板模板参数?

我正在尝试.natvis为 Visual Studio创建一个文件。根据此页面,我可以使用等引用模板参数$T1, $T2。所以在MyClass<A> $T1will 引用类型的情况下A。这有效。但在我的情况下A是一个模板本身,我需要引用它的参数,某种$T1<$T1>- 但这显然不起作用。

c++ debugging visual-studio natvis

7
推荐指数
1
解决办法
1642
查看次数

多个子项目依赖于同一个库

我有一个项目main_project。它依赖于两个库 -libAlibB,而这又依赖于lib_common每个库。

以图形方式项目的结构如下所示:

main_project
   |
   +-libA
   |   |
   |   +-CMakeLists.txt
   |
   +-libB
   |   |
   |   +-CMakeLists.txt
   |
   +-lib_common
   |   |
   |   +-CMakeLists.txt
   |
   +-CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

既然libA使用了,那么调用insidelib_common是很自然的。但这也取决于。如果我再次将其放入子目录中,它将编译两次。我不想要这样。另外,我想保持所有子项目的干净和独立 - 这就是为什么我不想放入顶级的(因为没有任何东西)。add_subdirectory(lib_common)libACMakeLists.txtlibBlib_commonlib_commonmain_projectCMakeLists.txtlib_commonmain_project

我有哪些选择?

cmake

7
推荐指数
1
解决办法
2671
查看次数

模板参数 - 具有可变参数的函数指针

我知道我可以这样做:

template<typename T, typename Ret, typename A1, typename A2, Ret(T::*F)(A1, A2)>
class C{}
Run Code Online (Sandbox Code Playgroud)

但是你可以看到这一点A1并且A2有点难看.实际上我不知道论点的数量.听起来像是一个可变参数模板的工作.不幸的是我不能这样做:

// doesn't work - parameter pack must appear at the end of the template parameter list
template<typename T, typename Ret, typename... Args, Ret(T::*F)(Args...)>
class C{}
Run Code Online (Sandbox Code Playgroud)

这不是:

模板类C;

// doesn't work - wrong syntax
template<typename T, typename F, typename Ret, typename... Args>
class Delegate2<Ret(T::*F)(Args...)>{}
Run Code Online (Sandbox Code Playgroud)

我想要太多吗?

c++ variadic-templates c++11

6
推荐指数
1
解决办法
1282
查看次数

不像孩子一样开始一个过程

我需要启动一个进程并将其作为独立进程运行。我有某种入门应用程序,目的是运行另一个exe并立即退出。实现这一目标的最佳方法是什么?

CreateProcess多次阅读文档,但仍然有疑问。文档说CloseHandle我完成后需要打电话。但是我的父母的应用程序不应该等待孩子退出。文档的另一部分说,我可以不理会句柄-当父进程终止时,系统将关闭它们。这是否意味着子应用程序在父项之后立即退出?似乎不正确-我关闭了启动器,但子进程仍然运行。

DETACHED_PROCESS似乎我在寻找一个标志。但是文档说明了一些有关控制台的内容。什么控制台?我不在乎控制台。

c++ winapi createprocess

5
推荐指数
1
解决办法
3828
查看次数

无边框窗口.如何添加阴影并删除1px边框?

我需要创建一个具有指定背景颜色的无边框窗口.我知道如何删除非客户区域并得到这样的东西:

在此输入图像描述

这很酷但不是我想要的.如果你仔细看看任何一个航空窗口 - 它周围有一个阴影(实际上这不是阴影,而是一些发光).我找到了一个可以使用此代码添加阴影的地方:

const MARGINS shadow_on = { 1, 1, 1, 1 };
DwmExtendFrameIntoClientArea(hwnd, &shadow_on);
Run Code Online (Sandbox Code Playgroud)

这几乎是做它的工作(认为这对我来说绝对不清楚 - 文档没有提到关于阴影和这个函数的关系).几乎.窗户周围出现了一个薄边框.看起来它是半透明的,它打破了窗口的外观和感觉:

在此输入图像描述

我知道这是可能的 - 视觉工作室甚至以某种方式改变了这个边界的颜色!

更新:正如IInspectable在评论中注意到我可以使用负边距DwmExtendFrameIntoClientArea().我设置了-1值并得到了这个结果:

在此输入图像描述

正如你所看到的 - 它甚至更奇怪.我试图用颜色填充背景,但没有运气.

windows winapi borderless

5
推荐指数
1
解决办法
1966
查看次数