小编Som*_*ion的帖子

根据用户提供的模板参数启用某些模板参数

考虑以下类模板:

template<class T, std::size_t S, SomeEnum = SomeEnum::NOT_DYNAMIC>
class Foo {
Run Code Online (Sandbox Code Playgroud)

其中 SomeEnum 定义为

class SomeEnum { NOT_DYNAMIC, DYNAMIC };
Run Code Online (Sandbox Code Playgroud)

这个类有一个 private std::array,但根据用户传递给 SomeEnum 的值,我想改用std::vector. 例如,如果用户通过SomeEnum::DYNAMIC,我将使用std::vector代替std::arraystd::conditional_t这将通过和来实现[[no_unique_address]]

我想知道是否有一种方法可以“删除”非类型模板参数S,以防用户通过SomeEnum::DYNAMIC。这是为了避免用户在不必要时键入大小,因为底层容器是std::vector。同时,我需要保留S参数,以防用户没有将任何内容传递给SomeEnum,因为std::array也需要大小。

是否可以通过一些技巧来实现,如果不能,我将如何解决这个问题?

目前的想法:

  • 按照解释使用 std::conditional_t ,
  • 使用继承,或使用专业化(尚未尝试或考虑)
  • 多态性不是一种选择

c++ templates tmp

4
推荐指数
1
解决办法
67
查看次数

小尾数和覆盖内存位置

首先我\xe2\x80\x99ll明确表示我知道这段代码是UB。我仍然不确定这是如何运作的。

\n
#include <stdio.h>\n\nint x[] = {1, 2, 3};\nchar s[] = "hello";\n\nint main()\n{\n    puts(s);\n    x[3] = (\'e\' << 16) + (\'y\' << 8) + \'b\';\n    puts(s);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

所以这会打印你好和再见。当然是 UB,但我想知道这里发生了什么。\n我以为我理解小端和大端是如何工作的,但显然 \xe2\x80\x99 不是这样,因为我\xe2\x80\x99一直在查看这已经过去 30 分钟了,但仍然不明白 xe2x80x99 发生了什么。

\n

如果可能的话,我真的很感激图表\xe2\x80\xa6

\n

我的理解:

\n
    \n
  • \xe2\x80\x98x\xe2\x80\x99 和 \xe2\x80\x98s\xe2\x80\x99 与此输出一起在内存中按顺序排列。
  • \n
  • 覆盖 x[3] 会覆盖 s。
  • \n
\n

我不\xe2\x80\x99t 得到:

\n
    \n
  • 如何以及为什么打印 \xe2\x80\x98bye\xe2\x80\x99 。记忆发生了什么。让\xe2\x80\x99s 假设\xe2\x80\x99s 不是UB\xe2\x80\xa6
  • \n
  • 如何以及为何在 \xe2\x80\x98bye\xe2\x80\x99 中的 \xe2\x80\x98e\xe2\x80\x99 之后插入空终止符。
  • \n
  • 字节序与这一切有什么关系。
  • \n
\n

谢谢。

\n

c memory endianness undefined-behavior

2
推荐指数
1
解决办法
59
查看次数

标签 统计

c ×1

c++ ×1

endianness ×1

memory ×1

templates ×1

tmp ×1

undefined-behavior ×1