我正在开发一个游戏引擎,我为编写多种格式的图像加载器太麻烦了,所以我的问题是:是否有一个抽象的图像加载库来加载图像文件?我只需要加载文件然后使用像素数组将它们打印到屏幕上.
在C++中,我想使用Unicode来做事情.因此,在掉下Unicode的兔子洞之后,我终于陷入了混乱,头痛和地方的火车残骸.
但是在Boost中,我遇到了一个不幸的问题,即尝试使用Unicode文件路径并尝试使用带有Unicode输入的Boost程序选项库.我已经阅读了关于locales,codecvts,Unicode编码和Boost主题的任何内容.
我目前试图让事情发挥作用的是使用一个带有UTF-8字符串的codecvt并将其转换为平台的编码(POSIX上的UTF-8,Windows上的UTF-16),我一直在努力避免wchar_t.
我实际上最接近的是尝试使用Boost.Locale,在输出时从UTF-8字符串转换为UTF-32字符串.
#include <string>
#include <boost/locale.hpp>
#include <locale>
int main(void)
{
std::string data("Testing, ?");
std::locale fromLoc = boost::locale::generator().generate("en_US.UTF-8");
std::locale toLoc = boost::locale::generator().generate("en_US.UTF-32");
typedef std::codecvt<wchar_t, char, mbstate_t> cvtType;
cvtType const* toCvt = &std::use_facet<cvtType>(toLoc);
std::locale convLoc = std::locale(fromLoc, toCvt);
std::cout.imbue(convLoc);
std::cout << data << std::endl;
// Output is unconverted -- what?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想我还有其他一些转换工作使用宽字符,但我真的不知道我在做什么.我不知道这个工作的正确工具是什么.救命?
// ((++currentEntry)--) is equivalent to (currentEntry + 1). Kind of.
menuEntries.insert((++currentEntry)--, newEntries.begin(), newEntries.end());
Run Code Online (Sandbox Code Playgroud)
所以我这里有世界上最糟糕的代码.有一个更好的方法吗?
当使用'+ 1'时,我得到这个:
source/menu.cpp:146:37: error: invalid operands to binary expression
('list<menuEntry *>::iterator' (aka '_List_iterator<menuEntry *>') and
'int')
menuEntries.insert(currentEntry + 1, ...
~~~~~~~~~~~~ ^ ~
Run Code Online (Sandbox Code Playgroud) 如何在C中找到当前区域设置的字符集?
setlocale(LC_ALL,NULL)返回"en_US.UTF8",但有没有办法获取字符集?在我的系统上的/etc/locale.gen中,它列出了语言环境和字符集,因此它不在名称中.
有没有办法按数据而不是键对 std::map 进行排序?现在我的代码将整个地图复制到一个数组中只是为了执行此操作。
假设我正在创建一个项目,并且我将项目中的大多数项目都放在名为Project的名称空间中.我在名为MainProject的名称空间Project中定义了一个类.
在源文件中,要实现该类,我是否"使用命名空间项目;" 或者我将它包装在'名称空间项目{...}'巢中?
Visual Studio 坚持要求在使用 CMake 时必须在 bin/Debug/ 而不仅仅是 bin/ 中创建可执行文件。有没有办法来解决这个问题?
现在我在Vim进入一个新行(或者在正常模式下按'p'或'o')我得到一个可爱的自动缩进,如果我退出插入模式而不添加任何内容,它也会消失.
在退出插入模式之前有没有办法绑定某些东西,例如插入幻像字符然后删除它?
我正在制作一个记录器,我希望有一些像流一样的事情发生,理想情况下,CLogger << "Testing, " << 1 << ",2,3\n";而不是CLogger->log("Testing, %i,2,3", 1);
我的问题是我该怎么做?我不想直接创建一个到stdout的流,因为我想使用我自己的方法,包括编写文件等.我已经考虑使用某个结构重载,该结构将当前流缓冲区刷新为方法,但我必须这样做CLogger << flush << "Test!\n";,这有点奇怪.
有人知道怎么做这个吗?