此类型和函数是否有现有名称?

共5个回答, 标签: c++ boolean c++17 variant

在计算机科学中,有两个难题: 缓存失效、命名和逐个错误。

这是关于命名事物的第 2 个问题。

我正在寻找这种技术或类型是否已经在其他地方使用,并且有名称。二分法是个不错的名字,但是Bools_at_compile_time是一个可怕的。

使用 dicho_ t = std:: 变体;
//(或从中继承的结构,并重载运算符 bool ())

Constexpr dichotomy_t 二分法 (布尔 b) {
如果 (b) 返回 std:: true_type {};
返回 std:: false _ type {};
}
模板
Constexpr 自动 bools_at_compile_time (F & f,Bools... bools) {
Static_ assert ((std:: is_same {} & &..);
返回 std:: 访问 (std:: 向前 (f),二分法 (bools).);
}

Dichotomy_t是真假之间的变体。它的运行时表示是0或者1.

这让你做的是:

_
Auto func = [&] (auto x,auto y) {
返回一些 _ 模板 ();/<-x 和 y 是这里的编译时 bools
};
返回 bool_ at _ compil_ time (func,x,y);//<-将运行时转换为编译时 bools
}

有什么名字吗Dichotomy_t或者更一般的Bools_at_compile_time技术?我正在寻找一个在任何社区都很有名的名字 (甚至是一个非 C 的名字), 甚至比句子更好地描述 “在生成的代码中获取运行时值并创建开关和一组编译时值以在两者之间进行选择” 的动词。

现场示例

一个好的答案将包括描述该名称含义的名称、引文/引文,以及在其他上下文中使用的命名事物的例子, 并证明此名称与上述类型/值和函数等效或包含在内。

(找到一个名字可能会有所帮助。枚举而不是一个布尔,它具有固定数量的已知状态,以及在每个 case 子句中将运行时值转换为编译时常数的开关/case 映射。))

第1个答案

我不知道这个模式的任何现有名称,但是如果你仔细看看 STL 是如何命名的,你可以使用足够接近的名称来显式地显示你的代码。

我也很喜欢Dispatcher_t@ Jarod42 的想法,我认为它比Dichotomy_t或者N_chotomy_t.

二分法 ()可以叫Make _ variant (b)。因为它将返回Std:: 变体参数中给定的布尔值。就像Std:: make _ tuple从多个参数创建元组。

我建议更换Bools_at_compile_timeStatic_eval。就像Static_assert在编译时进行断言。

如果不是这样Eval不是你的用例的正确形容词,你可以很容易地调整它静态 _ *.

# 包括
# 包括
# 包括

使用 dichotomy_t = std:: 变;
//(或从中继承的结构,并重载运算符 bool ())

Constexpr dichotomy_t make_variant (布尔 b) {
如果 (b) 返回 std:: true_type {};
返回 std:: false _ type {};
}
模板
Constexpr 自动统计 _ eval (F & f,Bools.bools) {
(Std:: is_same){} &..);
返回 std:: 访问 (std:: 转发)(F) 、 make _ variant (bools).);
}

模板
模板 () {
返回 x | | y;
}

_
Auto func = [&] (auto x,auto y) {
返回模板();//<-X 和 y 是这里的编译时 bools
};
返回 static_eval (func,x,y);//<-将运行时转换为编译时 bools
}

# 包括

Int main () {
Std:: cout <<foo (true,true) <"\ n";
}
第2个答案

函数的专用版本的生成被调用克隆.(见程序克隆。这个术语克隆用于命名优化器在不断传播期间生成的专用函数 (请参见Gcc 文档)。

生成的一组专用函数访问:可以命名克隆集.

为所有人生成此集合组合参数值。这个学期组合让我们假设每个参数的可能值集是有限的。

因此,我们可以为克隆集命名很长,例如,_所有参数值组合的克隆集_。另一个更模糊但更短的选择可能是组合克隆集.

正如已经指出的,根据参数选择要调用的正确函数的操作可以被调用派遣.

所以我提议Combinatiorial_clone_set_dispatch或者Dispatch_in_combinatorial_clone_set...

第3个答案

由于我不知道类似的实现,我将使用 bikeshed 颜色逐个类型。


使用 boolean_t = std:: 变体;

这是非常不言自明的,因为它是一个变体,可以存储一个或另一个Std:: 积分 _ 常数是真是假。这是一种布尔但是Bool_t很可能会引起混乱。另一种选择是Boolean_variant,但这可能太冗长了。


Constexpr boolean_t to_boolean_t (布尔 b) {
如果 (b) 返回 std:: true_type {};
返回 std:: false _ type {};
}

我从Convert_bool但这有点太一般了。To_boolean_t更具表现力。Make_boolean_t这也是一种可能,因为它基本上是一种Boolean_t工厂功能。注: 我之前选的To_constexpr_boolean但这太冗长了


模板
Constexpr 自动统计 _ eval (F & f,Bools.bools) {
(Std:: is_same){} &..);
返回 std:: 访问 (std:: 转发)(F) 、 to _ boolean_t (bools).);
}

我选择了Static_eval在这里,我喜欢 Clonk 的推理,但是 “静态” 在 C 中有上下文含义,所以替代方案是 (不重要的顺序):

  • Boolean_visit
  • 访问
  • Constexpr_eval
  • 访问
第4个答案

你的问题是:(大胆的矿)

我正在寻找一个在任何社区都很有名的名字 (甚至是一个 非 C 一),甚至是描述“获取运行时值和 在生成的代码中创建一个开关和一组编译时值 挑选之间比一句话要好。

有,但是只有当你从相关的科学领域采用它时:

美国国家电气法规 (NEC) 将交换机定义为 “a 安装在其上的大型面板、框架或面板组件, 表面上、背面或两者都有开关、过电流开关和其他开关 保护装置、公共汽车和通常的仪器 ”。A 的作用 总机是允许将提供给 配电盘成较小的电流,以便进一步分配和 提供开关、电流保护和 (可能) 计量 各种水流。一般来说,配电盘可以分配电力。 变压器、面板、控制设备,并最终 单个系统负载。

采用这种想法,你可以简单地称之为开关.

我还会补充说,指定 (即重复) 类型/变量名称中的存储类型或 cv 限定符等,即使不直接可见,除非真的需要强调,否则通常会将其保留为隐式。

第5个答案

也许 staticCastValue? 就像您将动态 (运行时) 值转换为静态值一样。 可以与不同类型的模板或重载一起使用。

或者也许 assertInmutable? 就像你将一个可变类型转换成一个不可变类型一样。

或者不断地表达? 就像你在表达相同的值,但形式不变。 Constexpr 一样。

狂野的: 静态分叉? 正如有两件事可供选择一样,因此存在分歧。

分叉 动词 句意: 1. 分成两根树枝或叉子。 开罗河分叉的正下方

还是最后的交谈? 明确表示该值将被转换为与 constexpr 相似或兼容的值。

相关问题

此类型和函数是否有现有名称? 将位与布尔值进行比较 在 bool 中设置额外的位使得它同时为 true 和 false 为什么我不能检索变体的索引并使用它来获取其内容?