问题标签 [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.
c++ - 基于模板类型在模板类中启用方法
我正在编写一个模板整数包装类,我想根据类的模板参数类型提供一个赋值运算符:
因为 operator= 不是成员模板,所以带有 boost::enable_if_c 的 SFINAE 将不起作用。提供此类功能的工作选项是什么?
c++ - 仅为某些 std::vector 启用模板类型
我只想为T=std::vector<T2>
参数(T2
是任意类型)进行模板匹配。我可以boost::enable_if
在模板参数中使用。如何测试一个类型是否T
是 a std::vector
?
我可以包含T::iterator
在我的模板中,以便非容器类型会导致替换失败并且不会被考虑(SFINAE)。但是,这样一来,任何定义的容器都T::iterator
将匹配,而不仅仅是std::vector<T2>
.
c++ - 在编译时确定类型是否为 STL 容器
我想编写一个模板,在编译时确定一个类型是否是 stl 容器。
我有以下代码:
但我不确定如何为std::vector<T,Alloc>, deque<T,Alloc>, set<T,Alloc,Comp>
等创建必要的专业化......
c++ - 在运行时将 ID 解析为派生类型
假设我有 100 个从 Base 派生的类。这些派生类中的每一个都有一个介于 [0,100) 之间的唯一标识符,在编译时已知。
我有一个函数,它需要一个 ID,并且需要返回一个新分配的具有该 ID 的派生类实例。
为每个 ID 配备一个巨大的开关盒显然不是一个好的解决方案。下面提供了我能想到的最佳解决方案的一个示例,但我觉得有一种方法可以做到这一点,而无需 vtable 引入的开销。
我是傻了,还是有另一种不需要太多空间的方法?
c++ - 是否可以将函数模板作为模板参数传递?
假设我们有一个模板函数:
现在我们想将它用作另一个模板中的参数,例如
是否可以?
我知道我可以使用带有已定义 () 运算符的结构。我只是对功能感到好奇。
编辑:
当我写这个问题时,我的朋友找到了一个部分解决方案:
但仍然 - 我很好奇是否有可能在调用之前没有实现函数类型。例如 - 我可能想用各种类型组合调用传递的模板:
c++ - 为什么 C++11 类型特征不是别名模板?
类似的问题:为什么
type_traits
用专门的模板结构而不是 constexpr 来实现?——但有不同的答案。
我意识到别名模板不能专门化,因此目前不能直接用于实现类型特征1。然而,这是委员会有意识的决定,据我所知,没有技术上的理由禁止这样做。
那么将类型特征实现为别名模板并简化它们的语法不是更有意义吗?
考虑
相对
当然,这在从Boost.TypeTraits迁移时引入了一个重大的界面变化——但这真的是一个大问题吗?
毕竟,代码无论如何都需要修改,因为类型驻留在不同的命名空间中,并且由于许多现代 C++ 程序员不愿意打开命名空间,因此将明确限定(如果它会被更改的话)。
另一方面,它极大地简化了代码。鉴于模板元编程经常变得嵌套、复杂和复杂,显然更清晰的界面是有益的。
我错过了什么吗?如果不是,我会很感激一个不仅仅是猜测的答案,而是依赖于(并且可以引用)委员会决策理由的知识。
1但间接地很好!考虑:
其中meta::is_pointer<T>
对应于当前std::is_pointer<T>
类型。
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 个元素的列表!
有谁知道为什么会这样?
c++ - 检查成员是否存在,可能在基类中,C++11 版本
在https://stackoverflow.com/a/1967183/134841中,提供了一种解决方案,用于静态检查成员是否存在,可能在某个类型的子类中:
但是,它不适用于 C++11final
类,因为它继承自被测类,这会final
阻止。
OTOH,这个:
无法在基类中找到该reserve(int/size_t)
方法。
是否有这个元函数的实现,它既可以在 的基类中找到reserved()
,并且如果是T
仍然可以工作?T
final
c++ - 如何正确检查(const)重载方法
我目前正在尝试编译以下内容:
然而,由于存在两个可能的to_foo()
成员,专业化变得混乱,因此它将选择默认情况。一旦我删除其中一个to_foo()
成员,它就会起作用,但是其中一种callX()
方法会失败,因为它与常量不匹配。
在这种情况下有什么方法可以检测到这个功能吗?
编辑:
这是关于 ideone 的示例:http: //ideone.com/E6saX
当其中一种方法被删除时,它工作得很好:http: //ideone.com/iBKoN
c++ - 检查成员是否存在,可能在基类中,VS2005/08 版本
在检查成员是否存在,可能在基类中,C++11 版本中,我们开发了 SFINAE 的经典成员检查类型特征的 C++11 版本,以检查也适用于 C++的继承的成员函数11 个final
类,但也使用 C++11 特性(即decltype
):
MSVC自 VS2005 起final
作为非标准扩展名,但仅在 VS2010 中添加。剩下的 VS2005 和 2008 中,标记为的类仍然破坏了经典的类型特征,并且不能使用 C++11 版本。sealed
decltype
sealed
那么,有没有办法制定has_resize_method
它也适用于 VC2005/08sealed
类?
显然,正如使用仅限 C++11 的功能来解决仅限 C++11 的final
问题sealed
(如果有一个适用于所有三组编译器 {C++11,{VS2005,VS2008},all others} 的解决方案,那会很酷,但可能要求太多了:)