问题标签 [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 回答
83 浏览

c++ - 基于模板类型在模板类中启用方法

我正在编写一个模板整数包装类,我想根据类的模板参数类型提供一个赋值运算符:

因为 operator= 不是成员模板,所以带有 boost::enable_if_c 的 SFINAE 将不起作用。提供此类功能的工作选项是什么?

0 投票
3 回答
1523 浏览

c++ - 仅为某些 std::vector 启用模板类型

我只想为T=std::vector<T2>参数(T2是任意类型)进行模板匹配。我可以boost::enable_if在模板参数中使用。如何测试一个类型是否T是 a std::vector

我可以包含T::iterator在我的模板中,以便非容器类型会导致替换失败并且不会被考虑(SFINAE)。但是,这样一来,任何定义的容器都T::iterator将匹配,而不仅仅是std::vector<T2>.

0 投票
9 回答
20864 浏览

c++ - 在编译时确定类型是否为 STL 容器

我想编写一个模板,在编译时确定一个类型是否是 stl 容器。  

我有以下代码:

但我不确定如何为std::vector<T,Alloc>, deque<T,Alloc>, set<T,Alloc,Comp>等创建必要的专业化......

0 投票
2 回答
99 浏览

c++ - 在运行时将 ID 解析为派生类型

假设我有 100 个从 Base 派生的类。这些派生类中的每一个都有一个介于 [0,100) 之间的唯一标识符,在编译时已知。

我有一个函数,它需要一个 ID,并且需要返回一个新分配的具有该 ID 的派生类实例。

为每个 ID 配备一个巨大的开关盒显然不是一个好的解决方案。下面提供了我能想到的最佳解决方案的一个示例,但我觉得有一种方法可以做到这一点,而无需 vtable 引入的开销。

我是傻了,还是有另一种不需要太多空间的方法?

0 投票
3 回答
270 浏览

c++ - 是否可以将函数模板作为模板参数传递?

假设我们有一个模板函数:

现在我们想将它用作另一个模板中的参数,例如

是否可以?

我知道我可以使用带有已定义 () 运算符的结构。我只是对功能感到好奇。

编辑:

当我写这个问题时,我的朋友找到了一个部分解决方案:

但仍然 - 我很好奇是否有可能在调用之前没有实现函数类型。例如 - 我可能想用各种类型组合调用传递的模板:

0 投票
3 回答
3644 浏览

c++ - 为什么 C++11 类型特征不是别名模板?

类似的问题:为什么type_traits用专门的模板结构而不是 constexpr 来实现?——但有不同的答案。

我意识到别名模板不能专门化,因此目前不能直接用于实现类型特征1。然而,这是委员会有意识的决定,据我所知,没有技术上的理由禁止这样做。

那么将类型特征实现为别名模板并简化它们的语法不是更有意义吗?

考虑

相对

当然,这在从Boost.TypeTraits迁移时引入了一个重大的界面变化——但这真的是一个大问题吗?

毕竟,代码无论如何都需要修改,因为类型驻留在不同的命名空间中,并且由于许多现代 C++ 程序员不愿意打开命名空间,因此将明确限定(如果它会被更改的话)。

另一方面,它极大地简化了代码。鉴于模板元编程经常变得嵌套、复杂和复杂,显然更清晰的界面是有益的。

我错过了什么吗?如果不是,我会很感激一个不仅仅是猜测的答案,而是依赖于(并且可以引用)委员会决策理由的知识。


1但间接地很好!考虑:

其中meta::is_pointer<T>对应于当前std::is_pointer<T>类型。

0 投票
1 回答
2507 浏览

c++ - 生成巨大的 Boost.MPL 类型序列

考虑以下自动生成 Boost.MPL 类型序列(列表或向量)的代码。

根据 Boost.MPL 文档,一个boost::mpl::list序列最多可以有多个BOOST_MPL_LIMIT_LIST_SIZE元素,类似地,boost::mpl::vector编译器最多可以包含BOOST_MPL_LIMIT_VECTOR_SIZE. 在我的系统上,这两个宏都评估为 20。

MSVC++ 2010 和 Boost 1.47.0 确实不能生成超过记录的 20 个元素的向量。然而,令人惊讶的是,它可以生成包含多达 247 个元素的列表!

有谁知道为什么会这样?

0 投票
2 回答
9997 浏览

c++ - 检查成员是否存在,可能在基类中,C++11 版本

https://stackoverflow.com/a/1967183/134841中,提供了一种解决方案,用于静态检查成员是否存在,可能在某个类型的子类中:

但是,它不适用于 C++11final类,因为它继承自被测类,这会final阻止。

OTOH,这个:

无法在基类中找到该reserve(int/size_t)方法。

是否有这个元函数的实现,它既可以在 的基类中找到reserved(),并且如果是T仍然可以工作?Tfinal

0 投票
3 回答
222 浏览

c++ - 如何正确检查(const)重载方法

我目前正在尝试编译以下内容:

然而,由于存在两个可能的to_foo()成员,专业化变得混乱,因此它将选择默认情况。一旦我删除其中一个to_foo()成员,它就会起作用,但是其中一种callX()方法会失败,因为它与常量不匹配。

在这种情况下有什么方法可以检测到这个功能吗?

编辑

这是关于 ideone 的示例:http: //ideone.com/E6saX

当其中一种方法被删除时,它工作得很好:http: //ideone.com/iBKoN

0 投票
2 回答
918 浏览

c++ - 检查成员是否存在,可能在基类中,VS2005/08 版本

检查成员是否存在,可能在基类中,C++11 版本中,我们开发了 SFINAE 的经典成员检查类型特征的 C++11 版本,以检查也适用于 C++的继承的成员函数11 个final类,但也使用 C++11 特性(即decltype):

MSVC自 VS2005 起final作为非标准扩展名,但仅在 VS2010 中添加。剩下的 VS2005 和 2008 中,标记为的类仍然破坏了经典的类型特征,并且不能使用 C++11 版本。sealeddecltypesealed

那么,有没有办法制定has_resize_method它也适用于 VC2005/08sealed类?

显然,正如使用仅限 C++11 的功能来解决仅限 C++11 的final问题sealed(如果有一个适用于所有三组编译器 {C++11,{VS2005,VS2008},all others} 的解决方案,那会很酷,但可能要求太多了:)