问题标签 [c++11]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
612 浏览

c++ - Lambda 表达式和脚本解析——这是一个好的设计理念吗?

我已经编写了一些基本的 2D 射击游戏,就它们而言,它们运行良好。为了建立我的编程知识,我决定使用一种简单的脚本语言来扩展我的游戏来控制一些对象。其目的更多是关于编写脚本解析器/执行器的一般设计过程,而不是对随机对象的实际控制。

所以,我目前的思路是使用一个 lambda 表达式容器(可能是一个映射)。当解析器读取每一行时,它将确定表达式的类型。然后,一旦它决定了指令的类型并发现了它必须使用的任何值,它就会打开映射到该表达式的类型,并将它需要工作的任何值传递给它。

一个或多或少的伪代码示例如下所示:

那么,你们觉得这样的设计怎么样?

0 投票
4 回答
25692 浏览

c++ - 可变长度模板参数列表?

我记得看到这样的事情正在做:

也就是说,X 继承自作为模板参数传递的可变长度类型名列表。当然,此代码是假设的。

不过,我找不到任何参考。是否可以?是 C++0x 吗?

0 投票
1 回答
475 浏览

c++ - C++:has_trivial_X 类型特征

boost 库,似乎是即将到来的 C++0x 标准,定义了各种类型特征模板,以区分具有普通构造函数、复制构造函数、赋值或析构函数的对象与没有的对象。它最重要的用途之一是优化某些类型的算法,例如通过使用 memcpy。

但是,我不明白所有各种 has_trivial_X 模板之间真正的实际区别。C++ 标准仅定义了与我们相关的两大类类型:POD 和非 POD。如果类型具有定义的构造函数、复制构造函数、赋值运算符或析构函数,则该类型是非 POD。换句话说,任何不是内置类型或内置类型的 C-struct 的东西都不是 POD。

那么区分 has_trivial_assign 和 has_trivial_constructor 的意义何在?如果一个对象具有非平凡的赋值运算符或非平凡的构造函数,则它不是 POD。那么在什么情况下知道一个对象有一个平凡的赋值运算符,但一个非平凡的构造函数是有用的呢?

换句话说,为什么不定义一个单一的类型特征模板,is_pod<T>然后用它来完成呢?

0 投票
6 回答
7116 浏览

c++ - 确定 C++ 中的最大可能对齐方式

是否有任何可移植的方法来确定任何类型的最大可能对齐方式是多少?

例如在 x86 上,SSE 指令需要 16 字节对齐,但据我所知,没有指令需要更多,因此任何类型都可以安全地存储到 16 字节对齐的缓冲区中。

我需要创建一个缓冲区(例如 char 数组),我可以在其中写入任意类型的对象,因此我需要能够依赖缓冲区的开头进行对齐。

如果一切都失败了,我知道分配一个 char 数组new可以保证最大对齐,但是使用 TR1/C++0x 模板alignment_ofaligned_storage,我想知道是否可以在我的缓冲区中就地创建缓冲区类,而不是需要动态分配数组的额外指针间接。

想法?

我意识到有很多选项可以确定一组有界类型的最大对齐方式:联合,或者只是alignment_of来自 TR1,但我的问题是类型集是无界的。我事先不知道哪些对象必须存储到缓冲区中。

0 投票
6 回答
5243 浏览

c++ - 从复制构造函数调用默认赋值运算符是不好的形式吗?

考虑需要复制的一类。副本中的绝大多数数据元素必须严格反映原始数据,但只有少数元素的状态不需要保留,需要重新初始化

从复制构造函数调用默认赋值运算符是不好的形式吗?

默认赋值运算符将与普通旧数据(int、double、char、short)以及用户定义的每个赋值运算符的类一起表现良好。指针需要单独处理。

一个缺点是,由于没有执行额外的重新初始化,这种方法使赋值运算符失效。也不可能禁用赋值运算符,从而打开用户使用不完整的默认赋值运算符创建损坏类的选项A obj1,obj2; obj2=obj1; /* Could result is an incorrectly initialized obj2 */

a(orig.a),b(orig.b)...放宽 to除了a(0),b(0) ...必须写的要求会很好。需要将所有的初始化编写两次,这会为错误创建两个位置,如果要将新变量(例如double x,y,z)添加到类中,则需要在至少 2 个位置而不是 1 个位置正确添加初始化代码。

有没有更好的办法?

在 C++0x 中有没有更好的方法?

输出:

替代复制构造函数:

0 投票
2 回答
778 浏览

c++ - C++0x 中是否有本地化支持的更新?

我使用 C++ 语言环境方面的工作越多,我就越了解 --- 它们被破坏了。

  • std::time_get-- 与std::time_put(如在 C strftime/strptime 中一样)不对称,并且不允许使用 AM/PM 标记轻松解析时间。
  • 我最近发现,在某些语言环境(如ru_RU.UTF-8)下,简单的数字格式可能会产生非法的 UTF-8。
  • std::ctype假设上/下可以在每个字符的基础上完成(大小写转换可能会改变字符数并且它取决于上下文)是非常简单的。
  • std::collate-- 不支持排序规则(区分大小写或不区分大小写)。
  • 无法在时间格式中指定与全球时区不同的时区。

以及更多...

  • 有人知道 C++0x 的标准方面是否会发生任何变化?
  • 有什么方法可以带来这种变化的重要性?

谢谢。

编辑:如果链接无法访问,请进行说明:

std::numpunct将千位分隔符定义为 char。因此,当 U+2002 中的分隔符——不同类型的空间时,它不能在 UTF-8 中作为单个字符再现,而是作为多字节序列再现。

在 C APIstruct lconv中,将千位分隔符定义为字符串,并且不会遇到此问题。因此,当您尝试使用 UTF-8 语言环境使用 ASCII 以外的分隔符格式化数字时,会产生无效的 UTF-8。

要重现此错误,请将 1234 写入带有灌输ru_RU.UTF-8语言环境的 std:ostream

EDIT2:我必须承认 POSIX C 本地化 API 工作得更顺畅:

  • strftime 有倒数——strptime(strftime 与 相同std::time_put::put
  • 由于我上面提到的一点,数字格式没有问题。

然而,它仍然是完美的。

EDIT3:根据关于 C++0x 的最新注释,我可以看到std::time_get::get-strptimestd::time_put::put.

0 投票
8 回答
6699 浏览

c++ - constexpr 和字节序

在 C++ 编程世界中不时出现的一个常见问题是编译时确定字节顺序。通常这是通过几乎不可移植的#ifdefs 来完成的。但是 C++11constexpr关键字和模板专业化是否为我们提供了更好的解决方案?

执行以下操作是否合法 C++11:

然后专门为两种字节序类型创建一个模板:

然后做:

0 投票
2 回答
5144 浏览

c++ - std::regex - 是否有一些需要链接的库?

我收到以下代码的链接器错误:

0 投票
2 回答
1026 浏览

c++ - 是否有 C++ 库来创建强大的枚举?

理想情况下,我希望以下示例能够正常工作,但我想其中一些示例无法在 C++ 中实现。

我经常使用它们,目前我从头开始编写每一个。我知道一个完整的通用解决方案是一个梦想,所以我欢迎任何部分解决方案。也许有人创建了一个库或代码生成器?

更新1:

这个这个问题是相关的。我正在研究可以用它们解决哪些问题。

0 投票
8 回答
74124 浏览

c++ - static_assert 有什么作用,你会用它做什么?

你能举一个例子,static_assert(...)('C++11') 可以优雅地解决手头的问题吗?

我熟悉运行时assert(...)。我什么时候应该static_assert(...)比常规更喜欢assert(...)

另外,在boost有一个东西叫做BOOST_STATIC_ASSERT,它和 一样static_assert(...)吗?