我们的想法是通过只编写.cpp文件退出当前的.h/.cpp系统,然后在编译过程中生成模块文件,然后由其他.cpp文件使用.
这看起来非常棒.
但我的问题是:为什么他们从C++ 0x删除它?是因为太多的技术难题?时间不够?你是否认为他们会考虑使用它来获得一个不可思议的C++版本?
我有一个用户表,每行包含他们的姓名,电子邮件地址等.对于一些用户来说,这一行是一行文本行,有些是另外两行等等.但是我希望表中的每一行都是一行文本行,截断其余部分.
我看到了这两个问题:
事实上,我的问题与第一个问题完全相似,但由于链接已经死亡,我无法研究它.两个答案都说使用white-space: nowrap.然而,这不起作用,也许我错过了一些东西.
由于我无法向您展示代码,我转载了问题:
<style type="text/css">
td {
white-space: nowrap;
overflow: hidden;
width: 125px;
height: 25px;
}
</style>
<div style="width:500px">
<table>
<tr>
<td>lorem ipsum here... blablablablablablablablablabla</td>
<td>lorem ipsum here... blablablablablablablablablabla</td>
<td>lorem ipsum here... blablablablablablablablablabla</td>
<td>lorem ipsum here... blablablablablablablablablabla</td>
</tr>
</table>
</div>
Run Code Online (Sandbox Code Playgroud)
没有white-space表是500px宽,文本需要多行.
但是white-space: nowrap让浏览器只是忽略width指令并增加表的宽度,直到所有数据都适合一行.
我究竟做错了什么?
我目前正在尝试阅读从服务器发送的小型视频文件
为了使用libavformat读取文件,您应该调用
av_open_input_file(&avFormatContext, "C:\\path\\to\\video.avi", 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)
问题是在这种情况下,文件不在磁盘上,而是在内存中.
我现在正在做的是下载文件,使用临时名称将其写入磁盘,然后av_open_input_file使用临时文件名调用,这不是一个非常干净的解决方案.
事实上我想要的是一个功能,av_open_custom(&avFormatContext, &myReadFunction, &mySeekFunction);但我没有在文档中找到任何.我想这在技术上是可行的,因为文件的名称不能帮助库确定它使用的格式.
那么有这样的函数,还是av_open_input_file的替代品?
我阅读了许多关于strcpy,memcpy等不安全函数的文章,这些函数在处理外部数据时可能会导致安全问题,例如文件内容或来自套接字的数据.这可能听起来很愚蠢,但我写了一个易受攻击的程序,但我没有设法"破解"它.
我理解缓冲区溢出的问题.以此示例代码为例:
int main() {
char buffer[1];
int var = 0;
scan("%s", &buffer);
printf("var = 0x%x\n", var);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我执行程序并输入"abcde"时,程序输出0x65646362,它是十六进制+ little-endian中的"edcb".但是我读到你可以修改在堆栈上推送的eip值,以使程序执行一些不需要的代码(例如,在调用system()函数之前).
但是函数的程序集开始如下:
push %ebp
mov %ebp, %esp
and $0xfffffff0, %esp
sub $0x20, %esp
Run Code Online (Sandbox Code Playgroud)
由于%esp的值在函数开始时是随机的,并且由于这个"和",似乎没有可靠的方法将精确值写入推入的eip值.
此外,我读到可以执行你在缓冲区中编写的代码(这里缓冲区只有1个字节长,但实际上它足够大,可以存储一些代码)但是你会给依次提供什么值的eip这样做(考虑到缓冲区的位置是随机的)?
那么为什么开发人员如此担心安全问题(除了程序可能崩溃)?你有一个易受攻击的程序的例子,以及如何"破解"它来执行不需要的代码?我在linux上试过这个,Windows不太安全吗?
有人知道一个允许SQLite从中加载数据的包装器std::iostream吗?
更明确一点:
std::fstream dataStream("database.sqlite");
...
sqlite3_open(...something using dataStream...);
Run Code Online (Sandbox Code Playgroud)
我想使用流,因为它们的模块性:能够在仍然从网络下载文件时加载文件,即时解压缩数据等.
注册自己的VFS后,应该可以使用sqlite3_open_v2.经过一个小时的实现(记录错误的)函数,我的第一次尝试让我从SQLite得到一个奇怪的"内存不足"错误,我想我会问这里是否有人知道现有的实现,然后花几个小时调试我的.
在C++中读取文件的常用方法是:
std::ifstream file("file.txt", std::ios::binary | std::ios::ate);
std::vector<char> data(file.tellg());
file.seekg(0, std::ios::beg);
file.read(data.data(), data.size());
Run Code Online (Sandbox Code Playgroud)
读取1.6 MB文件几乎是即时的.
但是最近,我发现了std :: istream_iterator并且想要尝试它以编码一个漂亮的单行方式来读取文件的内容.像这样:
std::vector<char> data(std::istream_iterator<char>(std::ifstream("file.txt", std::ios::binary)), std::istream_iterator<char>());
Run Code Online (Sandbox Code Playgroud)
代码很好,但很慢.读取相同的1.6 MB文件大约需要2/3秒.我知道它可能不是读取文件的最佳方式,但为什么它这么慢?
以经典方式读取文件是这样的(我只谈论读取函数):
当您使用istream_iterator读取文件时,它如下所示:
我必须承认,第二种方式效率不高,但它比第一种方式慢至少200倍,这怎么可能?
我认为性能杀手是重定位或插入,但我尝试创建一个完整的向量并调用std :: copy,它同样慢.
// also very slow:
std::vector<char> data2(1730608);
std::copy(std::istream_iterator<char>(std::ifstream("file.txt", std::ios::binary)), std::istream_iterator<char>(), data2.begin());
Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个有很多模板的类,能够构建元组元组会让它变得容易多了
但我在MSVC++ 2010中尝试了这个简单的代码:
#include <tuple>
void main() {
auto x = std::make_tuple(std::make_tuple(5, true));
}
Run Code Online (Sandbox Code Playgroud)
我收到编译错误.如果我不使用std :: make_tuple但直接使用std :: tuple的构造函数,则会出现同样的问题
它是MSVC的错误还是标准不允许的元组元组?
谢谢
我想很多人都有这样的代码:
int foo;
switch (bar) {
case SOMETHING: foo = 5; break;
case STHNELSE: foo = 10; break;
...
}
Run Code Online (Sandbox Code Playgroud)
但是这段代码有一些缺点:
foo变量不是const的,而应该是所以我开始想知道是否有办法"改进"这种代码,我得到了这个小小的想法:
const int foo = [&]() -> int {
switch (bar) {
case SOMETHING: return 5;
case STHNELSE: return 10;
...
}
}();
Run Code Online (Sandbox Code Playgroud)
注意:第一对括号不是强制性的,但MSVC++尚不支持
您可以使用if-else使用相同的技巧,其中三元运算符太复杂,需要通过指针传递的变量进行初始化(如DirectX函数)等.
我的问题是:
编辑:这就是我所说的"DirectX功能"
_xAudio2 = [&]() -> std::shared_ptr<IXAudio2> {
IXAudio2* ptr = nullptr;
if (FAILED(XAudio2Create(&ptr, xAudioFlags, XAUDIO2_DEFAULT_PROCESSOR)))
throw std::runtime_error("XAudio2Create failed");
return std::shared_ptr<IXAudio2>(ptr, [](IUnknown* ptr) { …Run Code Online (Sandbox Code Playgroud) 我有一个PHP代码,如下所示:
class A {
public function __construct() {
$this->b = new B(function($x) { return $x + 1; });
}
};
class B {
public function __construct($dataProcessingFunction) {
$this->dataProcessingFunction = $dataProcessingFunction;
}
public function processData($data) {
$f = $this->dataProcessingFunction;
return $f($data);
}
};
Run Code Online (Sandbox Code Playgroud)
但是有一个问题:我绝对需要在A的析构函数之前调用B的析构函数.你可以看到,这似乎是合理的.B对象不需要任何A,所以应该没有问题.
但是从PHP 5.4.0开始,闭包似乎会自动隐藏$ this.因此,我传递给B并由B存储的lambda函数包含对A的引用.
这意味着A包含指向B的指针,B包含指向A的指针(通过闭包).在这种情况下,PHP文档说只有垃圾收集和随机顺序调用析构函数.猜猜看:B的析构函数总是在A之前被调用.
有没有办法以优雅的方式解决这个问题?
我正在尝试从UTF-8字符串中删除所有特殊字符和重音符号,如果可能的话将它们转换为等效的ASCII字符.
所以我只是使用这段代码:
$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input);
Run Code Online (Sandbox Code Playgroud)
问题是例如单词"début"变成"dbut"而不是"debut".为了使它工作,我需要添加对setlocale的调用,如下所示:
setlocale(LC_ALL, 'en_US.UTF8');
$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input);
Run Code Online (Sandbox Code Playgroud)
我不明白为什么.我认为UTF-8和ASCII总是相同的,无论你使用哪种语言环境.
编辑:我不是说UTF-8等于ASCII,我的意思是UTF-8总是等于UTF-8,ASCII总是等于ASCII
我有一个名为的函数_push,它可以处理不同的参数,包括元组,并且应该返回推送元素的数量.
例如,_push(5)应该在堆栈上推送'5'(lua的堆栈)并返回1(因为推送了一个值),同时_push(std::make_tuple(5, "hello"))应该按'5'和'hello'并返回2.
我不能简单地替换它_push(5, "hello")因为我有时使用_push(foo())并且我想允许foo()返回一个元组.
无论如何,我无法使它与元组一起工作:
template<typename... Args, int N = sizeof...(Args)>
int _push(const std::tuple<Args...>& t, typename std::enable_if<(N >= 1)>::type* = nullptr) {
return _push<Args...,N-1>(t) + _push(std::get<N-1>(t));
}
template<typename... Args, int N = sizeof...(Args)>
int _push(const std::tuple<Args...>& t, typename std::enable_if<(N == 0)>::type* = nullptr) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
假设你想推动一个tuple<int,bool>.这就是我期望它的工作方式:
_push<{int,bool}, 2> 被称为(第一个定义)_push<{int,bool}, 1> 被称为(第一个定义)_push<{int,bool}, 0> 被称为(第二个定义)但是对于g ++ 4.5(我唯一支持可变参数模板的编译器),我得到一个错误_push<Args...,N-1>(t) …
我已经在Visual C++ 2010中使用了C++ 0x的一些新功能,比如正则表达式或lambda函数.但有一个重要的特征是缺少:该<thread>头.
你知道任何代码可以作为替代品吗?
目前我正在使用boost的线程,但它与标准不完全相同,它给了我巨大的编译时间.我也发现只是:: thread,但作为一个业余爱好者,我不想花钱.
我认为代码不会太难(虽然我可能错了)但我不知道Win32 API是否足够.
拿这个简单的PHP代码:
$xmlWriter = new XMLWriter();
$xmlWriter->openURI('php://output');
$xmlWriter->startDocument('1.0', 'utf-8');
$xmlWriter->writeElement('test', $data);
$xmlWriter->endDocument();
$xmlWriter->flush();
Run Code Online (Sandbox Code Playgroud)
XMLWriter类有一个很好的特性:它会将您提供给它的任何数据转换为输出编码.例如,它将转换$data为UTF-8,因为我传入'utf-8'了该startDocument函数.
问题是在我的情况下,内容$data来自数据库,其输出格式为UTF-8,因此已经是UTF-8.XMLWriter 可能认为数据是在ISO-8859-1中并再次转换为UTF-8,我得到了奇怪的符号,我应该得到重音.
目前我使用utf8_decode围绕每一个字符串从数据库中,这意味着我从UTF-8转换为ISO-8859-1,然后XMLWriter的把它放回UTF-8的到来.
这有效但不干净:
$xmlWriter->writeElement('test', utf8_decode($data));
Run Code Online (Sandbox Code Playgroud)
有更清洁的解决方案吗?
编辑:显示一个完整的例子
$xmlWriter = new XMLWriter();
$xmlWriter->openURI('php://output');
$xmlWriter->startDocument('1.0', 'utf-8');
$xmlWriter->startElement('usersList');
$database = new PDO('mysql:host=localhost;dbname=xxxxx', 'xxxxx', 'xxxxx');
$database->exec('SET CHARACTER SET UTF8');
$database->exec('SET NAMES UTF8');
foreach ($database->query('SELECT name FROM usersList') as $user)
$xmlWriter->writeElement('user', $user[0]); // if the user's name is 'hervé' in the database, it will print 'hervé' instead …Run Code Online (Sandbox Code Playgroud)