评论功能是否有公认的最佳实践?我只知道doxygen风格,但C++没有正式支持它,就像Javadocs是Java一样,只是想知道什么是最好的.
设v1为目标向量,v2需要附加到后面.
我现在在做:
v1.reserve(v1.size() + v2.size());
copy(v2.begin(), v2.end(), back_inserter(v1));
Run Code Online (Sandbox Code Playgroud)
这是最有效的方式吗?或者它可以通过复制一块内存来完成?谢谢!
众所周知,C++中的内置枚举不是类型安全的.我想知道实现类型安全枚举的哪些类在那里使用...我自己使用以下"自行车",但它有点冗长和有限:
typesafeenum.h:
struct TypesafeEnum
{
// Construction:
public:
TypesafeEnum(): id (next_id++), name("") {}
TypesafeEnum(const std::string& n): id(next_id++), name(n) {}
// Operations:
public:
bool operator == (const TypesafeEnum& right) const;
bool operator != (const TypesafeEnum& right) const;
bool operator < (const TypesafeEnum& right) const;
std::string to_string() const { return name; }
// Implementation:
private:
static int next_id;
int id;
std::string name;
};
Run Code Online (Sandbox Code Playgroud)
typesafeenum.cpp:
int TypesafeEnum::next_id = 1;
bool TypesafeEnum::operator== (const TypesafeEnum& right) const
{ return id == right.id; }
bool TypesafeEnum::operator!= …
Run Code Online (Sandbox Code Playgroud) 我发现如果有很多类,当我每个类使用一个*.h和一个*.cpp文件时,编译时间会大大增加.我已经使用预编译头和增量链接,但编译时间仍然很长(是的,我使用boost;)
所以我想出了以下技巧:
因此,我只有8个翻译单元,而不是100多个翻译单元.编译时间缩短了4-5倍.
缺点是您必须手动包含所有*.cpp文件(但它不是真正的维护噩梦,因为如果您忘记包含链接器将提醒您的内容),并且某些VS IDE便利不适用于此方案,例如转到/转移到实施等
所以问题是,有很多cpp翻译单元真的是唯一真正的方法吗?我的伎俩是一种已知的模式,还是我错过了什么?谢谢!
有没有办法让以下工作在Swift 3?
let button = UIButton().apply {
$0.setImage(UIImage(named: "UserLocation"), for: .normal)
$0.addTarget(self, action: #selector(focusUserLocation),
for: .touchUpInside)
$0.translatesAutoresizingMaskIntoConstraints = false
$0.backgroundColor = UIColor.black.withAlphaComponent(0.5)
$0.layer.cornerRadius = 5
}
Run Code Online (Sandbox Code Playgroud)
该apply<T>
函数应该采用类型的闭包(T)->Void
,运行它self
进入它,然后简单地返回self
.
另一种选择是使用像" =>
" 这样的操作符(借用Kotlin和Xtend语言的想法).
试图做这样的扩展NSObject
:
extension NSObject {
func apply<T>(_ block: (T)->Void) -> T
{
block(self as! T)
return self as! T
}
}
Run Code Online (Sandbox Code Playgroud)
但它需要在闭包中显式声明参数类型:
let button = UIButton().apply { (it: UIButton) in
it.setImage(UIImage(named: "UserLocation"), for: .normal)
it.addTarget(self, action: …
Run Code Online (Sandbox Code Playgroud) 我需要原始C++/WinAPI中的.Net的FileSystemWatcher模拟.我几乎开始使用FindFirstChangeNotification/FindNextChangeNotification来编写一个代码,但后来我发现我可能不是第一个需要这个并且可能有人愿意分享的人.
理想情况下我需要的是一个可以按如下方式使用的类:
FileWatcher fw;
fw.startWatching("C:\MYDIR", "filename.dat",
FileWatcher::SIZE | FileWatcher::LAST_WRITE,
&myChangeHandler);
...
fw.stopWatching();
Run Code Online (Sandbox Code Playgroud)
或者,如果它会使用像boost :: signal这样的东西,它会更好.但是,除了标准库,提升和原始WinAPI之外,没有其他依赖项.谢谢!
请帮忙!我真的很有智慧.我的程序是一个小的个人笔记管理器(google为"cintanotes").在某些计算机上(当然我没有它们),它在启动后就会出现未处理的异常.除了他们倾向于拥有AMD CPU之外,没有任何关于这些计算机的特别之处.
环境:Windows XP,Visual C++ 2005/2008,原始WinApi.
以下是"Heisenbug"的确定内容:
1)崩溃只发生在Release版本中.
2)一旦删除所有与GDI相关的东西,崩溃就会消失.
3)BoundChecker没有抱怨.
4)编写日志表明崩溃发生在本地int变量的声明中!怎么会这样?内存腐败?
任何想法将不胜感激!
更新:我设法在"有故障"的PC上调试应用程序.结果:
"CintaNotes.exe中0x0044a26a处的未处理异常:0xC000001D:非法指令."
和代码中断
0044A26A cvtsi2sd xmm1,dword ptr [esp + 14h]
所以似乎问题出现在"代码生成/启用增强指令集"编译器选项中.它设置为"/ arch:SSE2"并且在不支持SSE2的计算机上崩溃.我已将此选项设置为"未设置",并且错误消失了.唷!
非常感谢大家的帮助!!
我需要解析潜在的巨大XML文件,所以我猜这会排除DOM解析器.
有没有适合C++的轻量级SAX解析器,与足迹上的TinyXML相比?XML的结构非常简单,不需要像名称空间和DTD这样的高级内容.只是元素,属性和cdata.
我知道Xerces,但它超过50mb的超大尺寸让我颤抖.
谢谢!
MSDN表示使用ReadDirectoryChangesW意味着调用进程具有备份和还原权限.
这是否意味着只有在管理员帐户下启动的流程才能正常运行?
我尝试了以下代码,它在作为受限用户运行时无法启用所需的权限.
void enablePrivileges()
{
enablePrivilege(SE_BACKUP_NAME);
enablePrivilege(SE_RESTORE_NAME);
}
void enablePrivilege(LPCTSTR name)
{
HANDLE hToken;
DWORD status;
if (::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
{
TOKEN_PRIVILEGES tp = { 1 };
if( ::LookupPrivilegeValue(NULL, name, &tp.Privileges[0].Luid) )
{
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
BOOL result = ::AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL);
verify (result != FALSE);
status = ::GetLastError();
}
::CloseHandle(hToken);
}
}
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?是否有从非管理员用户帐户使用ReadDirectoryChangesW的解决方法?似乎.NET的FileSystemWatcher可以做到这一点.谢谢!
更新:这是该类的完整代码:
class DirectoryChangesWatcher
{
public:
DirectoryChangesWatcher(wstring directory)
{
enablePrivileges();
hDir = ::CreateFile(directory.c_str(),
FILE_LIST_DIRECTORY | FILE_FLAG_OVERLAPPED,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS, …
Run Code Online (Sandbox Code Playgroud) 我正在实现一个自定义文本布局引擎,我需要一个简单的文本输出函数,它的功能类似于 WinAPI 的 TabbedTextOut。也就是说,它不应该包装单词或类似的东西。
为此,QPainter 的 drawText 似乎很慢。一般来说,它不是很快,但一些 Unicode 字符(笑脸)可能导致渲染耗时长达 500 毫秒(在 Ryzen 3900x 上)!与 TabbedTextOut 相比,它可能做了很多不必要的事情,这显然会导致巨大的问题。
我不想求助于依赖平台的解决方案。我认为应该有一种方法可以大大加快速度。
我试过的:
请提示我值得进一步探索的方向。谢谢!
PS 我在 Windows 10 上使用 Qt 5.15。
c++ ×8
performance ×3
winapi ×3
c++03 ×1
coding-style ×1
comments ×1
crash ×1
debugging ×1
enumeration ×1
enums ×1
gdi ×1
header-files ×1
ios ×1
module ×1
parsing ×1
qt ×1
qwidget ×1
sax ×1
saxparser ×1
security ×1
stl ×1
swift ×1
type-safety ×1
vector ×1
xml ×1