问题标签 [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 投票
2 回答
813 浏览

ocaml - 是否可以在 OCaml 中进行编译时执行,类似于 C++ 模板元编程?

在 C++ 中,作为模板参数的递归模板和常量值允许进行代码生成和编译时执行的有趣示例,例如阶乘.

是否可以在 OCaml 中使用参数多态性、仿函数或其他概念做类似的事情?

0 投票
3 回答
1847 浏览

c++ - 在编译时映射两种类型

我有一组与一对一关系相关的类型,例如:

我在编译时就知道这些关系。

然后,我有一个依赖于这两种类型的模板类:

现在,我的图书馆的用户将输入如下内容:

这很不方便,因为这两种类型之间存在依赖关系,用户只指定第一种类型就足够了。

此外,不应该混合这两种类型:

我对模板元编程不是很熟悉,我的印象是这是可行的任务,但我可能错了。

所涉及的类型数量很多,但是如果需要,我很乐意运行脚本来生成代码。

你知道这是可能的还是我在浪费时间?您有什么想法可以为我指明正确的方向吗?

0 投票
4 回答
6331 浏览

c++ - 在编译时检测 typedef(模板元编程)

我目前正在做一些模板元编程。就我而言,我可以处理任何“可迭代”类型,即 atypedef foo const_iterator以相同方式存在的任何类型。我试图为此使用新的 C++11 模板元编程,但是我找不到一种方法来检测是否缺少某种类型。

因为我还需要根据其他特性打开/关闭其他模板特化,所以我目前使用的模板有两个参数,第二个是通过std::enable_if. 这是我目前正在做的事情:

exists如果没有帮助模板,我无法做这样的事情。例如简单地做

不起作用,因为在应该使用这种特化的情况下,无效的默认情况被实例化了。

但是我在新的 C++11 标准中找不到exists任何地方,据我所知,它只是从boost::type_traits这种东西中获取的。但是,在主页上forboost::type_traits没有显示对任何可以替代使用的任何内容的引用。

是否缺少此功能,或者我是否忽略了其他一些明显的方法来实现所需的行为?

0 投票
1 回答
698 浏览

c++ - C++ 模板元编程专业化歧义

所以我刚开始使用模板元编程,我一直在写一个字符串类。我实现了 ToString、Concat、CharAt 和 Length,没有太多与模板相关的问题。我试图实现 Substring 如下:

当我编译时,我得到一个模棱两可的错误:

我有点困惑。我认为模板专业化的全部意义在于做这样的事情。为什么这不只是以下内容的扩展:

我该如何解决这种歧义?

谢谢。

0 投票
2 回答
1875 浏览

c++ - 无参数可变参数模板上的模棱两可的重载

有关的:


考虑这对可变参数模板:

这可以工作并编译。但是,没有第一个模板参数怎么写呢?

听起来微不足道?嗯,我就是这么想的。:-) 让我们考虑一些想法。

想法1:

行不通...当我尝试这个时,我想到了专业化,但转念一想,这不是它的工作原理。

在原始示例中,我创建了两个不同的重载模板,第一个采用 1 个模板参数,第二个采用 2 个或更多。没有歧义,也没有涉及专业化。我说对了吗?

想法2:

显然不会起作用,All<rest...>因为rest...为空不会扩展到对非模板函数的调用。

想法3:

让我们重新构建解决方案。

这个是不行的,因为 All(c) 会模棱两可。因此我需要有一个 0-arg 案例和一个 >0-arg 案例......或者 1-arg 案例和一个 >1-arg 案例呢?

想法#3.5:

是的,有效,但包含copypasta(在这种情况下很简单,但可能更大!),因此我会说它并不比我开始的更好。只是另一种解决方法。

想法#4:

让我们尝试#1,但使用类而不是函数。

这看起来很有希望,因为我可以专攻课程。但是,嘿,它是什么?

抱歉,未实现:无法将“rest ...”扩展为固定长度的参数列表

这不是 GCC 4.4 的事情吗?我在 MinGW GCC 4.6.1 (tdm-1) 上。


无论如何,我应该认为我不能直截了当地做这种基本的事情吗?是否需要使用带有额外虚拟模板参数的解决方法来完成此任务?

或者是否有一个简单、正确的变体来指定零参数的情况,这会起作用吗?

0 投票
1 回答
247 浏览

c++ - 如果存在一种类型,如何在编译时推断出两种类型共有的继承树的根?

我有一个问题,我需要发现两种类型(具有一个或零个基类)的共同祖先(如果存在)。是否有可能建立一个类型特征来解决这个问题?在代码中:

给定以下类型:

closest_common_ancestor将导致以下类型:

我相信如果我可以检查一个类型是否有零个或一个基类,如果有,那么我可以解决这个问题,如果是,那么该类型的名称。这可能吗?

0 投票
3 回答
2497 浏览

c++ - 如何在编译时检查类型是否为 std::vector::iterator?

我有一个问题,我需要检测给定类型是否是已知嵌套类型的实例,例如std::vector::iterator在编译时。我想创建类型特征is_std_vector_iterator

但我收到编译器错误:

是否可以检查依赖类型,例如std::vector<T,Allocator>::iterator


这是这种特征的一个激励用例:

0 投票
1 回答
500 浏览

c++ - 获取 mpl 向量的前 M 个元素

我有一个元素boost::mpl::vectorN说:

我希望获得一个M包含my_vector. 所以如果M是 2 我想要一个:

最初我想使用但无法为和erase<s,first,last>找出合适的模板参数。(我正在使用。)但是,我的理解也可以用于任务。解决这个问题的最佳方法是什么?firstlastat_c<...>::typefilter_view

0 投票
6 回答
445 浏览

c++ - 检测是否可以在 C++ 中派生类型

我有以下模板类和其类型的(全局)变量:

我预计会出现编译错误,因为int无法派生,但这在 Visual C++ 2010 下编译得很好。

如果我删除指针,我会得到预期的编译错误(不能从 int 派生):

我想使用这个类进行 SFINAE 测试给定类型是否是可以派生自的类:

然而,这总是报告真实的,即使对于原始类型,例如int由于上述原因。这是 C++ 的预期/有效行为吗?

0 投票
2 回答
202 浏览

c++ - 语法糖:自动创建简单的函数对象

我要实现一组类模板和两个特殊变量,_1以及_2.

他们应该将以下内容作为法律法规:

我想 _1 * 5 也应该产生一个一元函数,以及 _1 / 5 等。

  • 不允许升压
  • 不允许使用 lambda

现在我对模板和模板元编程的经验很少,所以我什至不知道从哪里开始以及我的类模板的结构应该是什么样子。我特别困惑,因为我不知道在我的类模板中是否必须分别为所有这些operator=, operator>>, operator+, ...-,...*编写实现.../- 或者有更通用的方法来做到这一点。

我将特别感谢这些运算符的实施示例的答案;模板对我来说仍然是一团糟。