小编Ale*_*lex的帖子

你如何使用Alexandrescu的预期<T>与void函数?

所以我遇到了这个(恕我直言)非常好的想法,使用返回值和异常的复合结构 - Expected<T>.它克服了传统错误处理方法(例外,错误代码)的许多缺点.

安德烈Alexandrescu的的谈话(系统误差在C++处理)它的幻灯片.

异常和错误代码具有基本相同的使用方案,其中函数返回某些内容而不返回内容.Expected<T>另一方面,似乎只针对返回值的函数.

所以,我的问题是:

  • 有没有人Expected<T>在实践中尝试过?
  • 你如何将这个成语应用于什么都不返回的函数(即void函数)?

更新:

我想我应该澄清一下我的问题.在Expected<void>专业化是有道理的,但我更感兴趣的是它如何被使用-在一致的使用成语.实现本身是次要的(并且很容易).

例如,Alexandrescu给出了这个例子(有点编辑):

string s = readline();
auto x = parseInt(s).get(); // throw on error
auto y = parseInt(s); // won’t throw
if (!y.valid()) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这段代码以一种自然流动的方式"干净".我们需要价值 - 我们得到它.但是,expected<void>有人必须捕获返回的变量并对其执行某些操作(如.throwIfError()或类似的东西),这不是那么优雅.显然,.get()无效是没有道理的.

那么,如果你有另一个函数,比如说toUpper(s),哪个函数就地修改了字符串并没有返回值,你的代码会是什么样子?

c++ error-handling runtime-error c++11

35
推荐指数
3
解决办法
1万
查看次数

如何将无符号的32位整数转换为MySQL或PHP中的签名?

我在PHP中有一个字符串(来自某些数据源),它表示格式化的无符号32位整数.我需要将它作为带符号的 32位整数存储到MySQL数据库中,以便稍后我可以从PHP检索它并将其用作(可能为负)有符号整数常量(因为PHP没有无符号整数).

所以,我需要的是一种转换方法,无论是PHP还是MySQL.它不应该依赖于平台(没有endian/32/64位问题).

我知道如何使用MySQL将有符号整数转换为无符号整数:

select CAST((-1062726980 & 0xFFFFFFFF) AS UNSIGNED INTEGER);
+------------------------------------------------------+
| CAST((-1062726980 & 0xFFFFFFFF) AS UNSIGNED INTEGER) |
+------------------------------------------------------+
|                                           3232240316 | 
+------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

但是我不能反过来工作(注意:MySQL在进行强制转换时使用64位算术).

谢谢.

php mysql unsigned signed casting

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

由于新的const,C++ 11对象在多线程环境中是否可能更慢?

根据Herb Sutter(http://isocpp.org/blog/2012/12/you-dont-know-const-and-mutable-herb-sutter),在C++ 11中,const方法不能改变对象位 -明智的,或者如果它们具有可变数据成员,则必须执行内部同步(例如,使用互斥锁).

假设我有一个全局对象,我从多个线程访问,并假设它有可变成员.为了论证,让我们假设我们不能修改类的来源(它由第三方提供).

在C++ 98中,这些线程将使用全局互斥锁来同步对此对象的访问.因此,访问需要单个互斥锁定/解锁.

但是,在C++ 11中,对此对象的任何const成员函数调用也将调用内部同步,因此,对此对象进行单个const函数调用将花费2次锁定/解锁操作(或更多,具体取决于函数的数量)你从一个线程打电话).请注意,仍然需要全局互斥锁,因为const似乎对编写器没有任何作用(除非其中一个非const方法调用const方法,否则可能会减慢它们的速度).

所以,我的问题是:如果我们所有的类都必须在C++中这样(至少可以被STL使用),这是否会导致过度的同步措施?

谢谢

编辑:一些澄清:

  1. 似乎在C++ 11中,除非其const成员函数在内部同步(或不执行任何写入),否则不能将类与标准库一起使用.

  2. 虽然C++ 11本身不会自动添加任何同步代码,但是符合标准库的类不需要在C++ 98中进行同步,但在C++ 11中需要它.因此,在C++ 98中,您可以避免对可变成员进行任何内部同步,但在C++ 11中则不能.

c++ multithreading const thread-safety c++11

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