问题标签 [template-meta-programming]

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 投票
1 回答
250 浏览

c++ - 如何查找,对象是由哪些Types组成的?

好的,昨天我在这里发布了几乎相同的问题 ,但我无法根据我的需要修改答案(工作)......我不想弄乱另一个话题,所以我开始了新的话题。

所以,我有 2 个(实际上大约 15 个)结构,它们可以组成一个对象

然后我有:

我想像这样使用它:

(整数仅用于示例目的)

所以我有一些模板魔法:

但我不能让它工作:(

我知道有很多代码,但这实际上是最小的示例...我已将此代码发布到ideone,以使其更好地阅读。

谢谢!

编辑:(在评论中提问)

我正在为 AI 构建系统,并希望在编译时尽可能多地解决问题。在这种情况下,我正在构建运动行为系统。我的代码提供了许多类型的行为,如“前往点”、“避开”、“避开障碍物”等。这些行为在上面的示例中被称为 A a、B。每个行为都有类似“performBehavior”的方法及其返回类型可以与其他“performBehavior”组合。

所以我想在编译时把特定的行为放在一起。例如。只是 A 或 A+C+D+F 等...

然后在我的更新中执行以下操作:

如果行为由“Go to point”组成,则比“performBehaviorGoTo”

如果行为由“Evade from”组成,则比“performBehaviorEvade”

...

这是非常简短的解释,但希望我已经表达了我的观点

0 投票
15 回答
6685 浏览

c++ - 自动选择一个足以容纳指定数字的变量类型

在 C++ 中有什么方法可以定义一个足够大的类型,最多可以容纳一个特定的数字,大概是使用一些聪明的模板代码。例如,我希望能够写:-

并且该类型是否解析为足以容纳指定值的最小类型?

背景:我需要使用来自外部数据文件的脚本生成一些变量定义。我想我可以让脚本查看值,然后根据值使用uint8_t, uint16_t,等,但是将大小构建到生成的 C++ 代码中uint32_t似乎更优雅。

我看不到任何方法可以制作可以做到这一点的模板,但是知道 C++ 模板,我确信有办法。有任何想法吗?

0 投票
5 回答
188 浏览

c++ - 这个元编程如何编译下来?

这是一个来自 wikipedia 的示例,它显示了 C++ 模板元编程:

我理解它是如何工作的,递归地使用 N 的模板参数值创建 Factorial 类型,直到找到特化 <0>,这允许编译器解析链上的值。

我的问题是:编译后会怎样?编译器最终会不会生成类似的东西:

还是结果会更复杂?我问是因为我想知道它是否基本上会导致:

被可执行代码中的常量 (24) 替换,或者如果它比这更复杂。我只是想弄清楚这如何提高已完成程序的效率,所以这会很有帮助:)

0 投票
4 回答
1885 浏览

c++ - 如何在 C++03 中“取消引用类型”?

如何在 C++03 中获得另一种类型的“取消引用类型”?请注意,它可以是其他可取消引用的类型,例如std::vector<int>::iterator.

例如,如果我有

我怎样才能弄清楚用什么代替???

没有提升!我想知道如何自己弄清楚。)

0 投票
1 回答
1494 浏览

c++ - 从 enable_if 的基础继承

我正在尝试为非字符数组部分专门化一个特征:

Visual Studio 2010 给了我一个 C2039(type不是enable_if...的元素)。但是,SFINAE 不应该只是在这里触底而不是给出编译器错误吗?或者 SFINAE 不适用于这种情况?

当然,我可以将 non-char 和 char 的特化分开:

但我真的很想知道为什么 SFINAE 在这种特殊情况下不起作用。

0 投票
2 回答
236 浏览

c++ - 仅针对一个索引的 C++ 方法模板特化

我想只为一个类的一个索引执行模板专业化。例如,在下面的代码中,我想在第一个类是 int 时创建一个特化,而不管第二个类是什么。有没有办法实现这个?

0 投票
17 回答
11567 浏览

c++ - 编译时常量 id

鉴于以下情况:

我希望 ID 为每个 T 生成一个唯一的编译时间 ID。我考虑__COUNTER__过 boost PP 库,但到目前为止还没有成功。我怎样才能做到这一点?

编辑:ID 必须可用作 switch 语句中的情况

Edit2:所有基于静态方法或成员地址的答案都不正确。尽管它们确实创建了一个唯一 ID,但它们在编译时不会被解析,因此不能用作 switch 语句的情况。

0 投票
1 回答
1038 浏览

c++ - boost::mpl::for_each 的类型包装器错误(来自 Abrahams & Gurtovoy book 的第 9.1.1 节)

以下代码几乎是从 David Abrahams 和 Aleksey Gurtovoy 所著的 C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond 一书的第 9.1.1 节中逐字复制的。

唯一的变化是我希望能够使用常规的 Boost 模板 mpl::identity 更改书中的类型包装器模板。但是,在 Microsoft Visual C++ Express 2010 (SP1) 下,如果我这样做,我会收到一个神秘的编译器警告。

这似乎与类型包装模板有一个名为“type”的内部类型定义有关。将该 typedef 更改为“Type”(或简单地删除该行)将使代码正常工作。有人对这种奇怪的行为有解释吗?

输出/I"C:\Program Files\boost\boost_1_47" /I"C:\Program Files\boost" /Zi /nologo /W3 /WX- /O2 /Oi /Oy- /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm- /EHsc /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Fp"Release\mpl.pch" /Fa"Release\" /Fo"Release\" /Fd"Release\vc100.pdb" /Gd /analyze- /errorReport:queue

0 投票
3 回答
1726 浏览

c++ - 一系列值的模板特化

我希望编写一个模板结构foo,它foo<N>::value_type是最接近的大小整数(向上舍入)到N. 例如和。foo<32>::value_type => uint32_t_foo<33>::value_type => uint64_tfoo<72>::value_type => uint64_t

为此,我需要一种优雅的方法来foo为一系列值提供部分特化,例如,1 <= N <= 8返回 uint8_t 等等,等等。有没有一种方法可以做到这一点,而不必专门化从 0 到 64 的所有内容。

0 投票
1 回答
4125 浏览

c++ - Boost MPL:仅在存在时调用(成员)函数

我有一个具有模板参数 T 的类 A。在某些用例中,类 T 提供了函数 func1(),而在某些用例中 T 不提供它。A 中的函数 f() 应该调用 func1(),如果它存在的话。我认为这应该可以通过 boost mpl 实现,但我不知道如何。这里有一些伪代码:

更好的是其他情况: