我有一个二进制文件,我知道一些布局.例如,让格式如下:
该文件应该看起来像(为了便于阅读,我添加了空格):
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个字节,依此类推.
现在我想读这个文件.目前我这样做:
char buffer[2] unsigned short len{ *((unsigned short*)buffer) };.现在我有一个字符串的长度.vector<char>并std::string从此向量创建一个.现在我有字符串ID.char bufferFloat[4]和转换*((float*)bufferFloat).这有效,但对我来说它看起来很难看.我可以直接读取unsigned short或float或string等没有char [x]创造?如果不是,那么正确投射的方法是什么(我读过我正在使用的那种风格 - 是旧风格)?
PS:当我写一个问题时,我头脑中提出的解释越清晰 - 如何从任意位置投出任意数量的字节char …
一类:
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) 有时候我看到这样的代码:
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是至关重要的.但为什么?我找不到任何解释.
我正在尝试将main流合并到development流,并且需要解析一些文件.解决方法我有一个错误:
文件路径在解析之前被篡改 - 编辑或还原.
我试图像这里描述的那样解决它,但没有成功.这是verify命令告诉我的:
目标文件
路径 - 分支更改9070(文本)A3269695246A89D21F341D8A5BB70B5Bfor source
filepath - edit change 22793(text)171BA2F3E0FFCEF3F7A34FDB7A2CEF69
filepath - add change 9049(text)A3269695246A89D21F341D8A5BB70B5B
什么branch change,edit change,add change是什么意思?为什么MD5相同但我仍然有错误?怎么解决?
作为散列的一部分,我需要将函数指针转换为字符串表示.使用全局/静态函数,它是微不足道的:
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.所以似乎没有任何指针可以转换.
我还能做些什么来获得字符串表示?
我正在尝试.natvis为 Visual Studio创建一个文件。根据此页面,我可以使用等引用模板参数$T1, $T2。所以在MyClass<A> $T1will 引用类型的情况下A。这有效。但在我的情况下A是一个模板本身,我需要引用它的参数,某种$T1<$T1>- 但这显然不起作用。
我有一个项目main_project。它依赖于两个库 -libA和libB,而这又依赖于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
我有哪些选择?
我知道我可以这样做:
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)
我想要太多吗?
我需要启动一个进程并将其作为独立进程运行。我有某种入门应用程序,目的是运行另一个exe并立即退出。实现这一目标的最佳方法是什么?
我CreateProcess多次阅读文档,但仍然有疑问。文档说CloseHandle我完成后需要打电话。但是我的父母的应用程序不应该等待孩子退出。文档的另一部分说,我可以不理会句柄-当父进程终止时,系统将关闭它们。这是否意味着子应用程序在父项之后立即退出?似乎不正确-我关闭了启动器,但子进程仍然运行。
DETACHED_PROCESS似乎我在寻找一个标志。但是文档说明了一些有关控制台的内容。什么控制台?我不在乎控制台。
我需要创建一个具有指定背景颜色的无边框窗口.我知道如何删除非客户区域并得到这样的东西:

这很酷但不是我想要的.如果你仔细看看任何一个航空窗口 - 它周围有一个阴影(实际上这不是阴影,而是一些发光).我找到了一个可以使用此代码添加阴影的地方:
const MARGINS shadow_on = { 1, 1, 1, 1 };
DwmExtendFrameIntoClientArea(hwnd, &shadow_on);
Run Code Online (Sandbox Code Playgroud)
这几乎是做它的工作(认为这对我来说绝对不清楚 - 文档没有提到关于阴影和这个函数的关系).几乎.窗户周围出现了一个薄边框.看起来它是半透明的,它打破了窗口的外观和感觉:

我知道这是可能的 - 视觉工作室甚至以某种方式改变了这个边界的颜色!
更新:正如IInspectable在评论中注意到我可以使用负边距DwmExtendFrameIntoClientArea().我设置了-1值并得到了这个结果:

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