问题标签 [template-templates]
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++11 - GCC、Clang 和 MSVC 中的可变模板模板参数和 sizeof 差异 - 谁是对的?
当使用可变参数模板-模板参数时,使用 sizeof...() 获取参数的数量 GCC 和 Clang 有不同的要求。GCC 要求您填写可变参数的模板参数,而 Clang 要求您不这样做。由于它们都声称符合标准,因此必须有一个错误或标准必须是模棱两可的(以防它们应该在 c++1y 中更正)。
示例(http://ideone.com/5TWFKY上的完整可编译示例):
GCC(注意:在这种情况下 Z 是任何非模板类):
铛:
MSVC 2013(为了完整性 - 与 Clang 相同,不支持 constexpr):
c++ - C++ - 如何构建类型的组合层次结构以实现可伸缩性?
我有三个可以静态组合的类。最低级别的类是A
并且是具有单个参数的模板类。比如说,这可能是一个 int。然后我有一个更高级别的类,B
它取决于类型T
和A
。最后,我有一个更高级的类C
,它依赖T
于A
和B
。
我可以看到两种编码这些关系的方法,使用模板模板或公共范围的 typedef:
现在考虑一个扩展模式的新类 D - 使用第一种方法,模板声明几乎完全无法管理:
第一种方法的优点是每个参与的班级不需要为更高级别的班级做准备。他们不需要意识到它们是层次结构的一部分,因此可以重用现有类而不更改它们。这在理论上感觉是可扩展的,但是如果不求助于可怕的预处理器宏,类声明语法很快就会变得几乎不可能处理。
或者:
第二种方法更加简洁,但是它要求层次结构的参与者将他们的模板参数作为公共类型定义的类型提供。他们需要在这个编译时接口上进行合作,以便他们可以将较低级别的类型传递到更高级别。如果它们在以后成为此类层次结构的一部分,则需要进行广泛的更改。这似乎意味着最好将所有模板类中的所有模板参数作为公共范围的 typedef 提供,以防万一它们最终在这种层次结构中使用。这对我来说不是很有可扩展性,但我在标准库中看到过类似的东西,其中value_type
经常提供模板参数。
我的问题是 - 我错过了每种方法的其他优点/缺点,以及在创建一个不断增长的类库时,哪种方法可能最有效,这些类往往像这样静态组合?一种风格比另一种更广泛接受吗?这里有没有考虑的替代方案?
关于实际应用的说明 - 我已经有一个实际应用,其中涉及以某些方式表现的特殊类型的数值。这些值被包装在更高级别的类中,每个类都提供一层额外的功能——每层一个。例如,一层提供回调机制,另一层提供缓存,另一层提供值验证,另一层提供转换功能。较高层可能需要了解比直接下面的层更多的信息,因此需要了解用于组成较低类型的类型。每个级别都有几个不同的实现,因此需要指定这么多类型。该层次结构的各个部分可以在其他代码中使用,反过来该代码也可能发现自己也是层次结构的一部分。这是一个相当经典的“组合”
c++ - 带有clang的模板阴影错误
正如以下代码片段中的注释所说,这是 gcc 4.4 的解决方法。错误,我现在可能应该删除它。有关这方面的背景,请参阅带有 gcc 4.4 的模板模板参数和可变参数模板。
在任何情况下,这都会在带有 clang 3.4.2-4 的 Debian Wheezy 上出现错误,该版本是从不稳定的向后移植的。这适用于 gcc 4.9,也从 Debian Wheezy 上的不稳定(和 4.7)向后移植。
错误是
我在 SO 上看到至少几个表面上相似的问题,即 Clang VS VC++:"error: declaration of 'T' shadows template parameter"和 C++ template that used to work in old gcc results in 'shadows template parameter' error in clang++ 但对我来说,它们是不同的问题还是相同的问题并不明显。
澄清赞赏。我不经常写C++,也有一段时间没看模板模板参数了。
c++ - 实现模板模板参数的部分模板特化
我在实现使用模板模板参数的类模板的专业化时遇到问题。例如,我想写一个用于排序的类:
然后我会这样称呼它:
我使用列表的特化,因为我想调用 std::list 实现的排序函数。但是,此代码不起作用。为什么找不到模板专业化?
我得到的错误是:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/algorithm:3772:40:错误:二进制表达式的操作数无效('std::__1: :__list_iterator' 和 'std::__1::__list_iterator') 区别类型 __len = __last - __first; ~~~~~~ ^ ~~~~~~~
这是因为它没有找到专业化。
c++ - 当返回值是类或类时如何使用 enable_if或班级, ETC。?
以下简化的类在从 get() 返回值时会执行不同的操作,具体取决于该类是使用双精度还是数组作为模板参数:
我应该如何编写 impl 的数组版本,以便支持数组中的任意数量的项目?g++-4.8.2 和 clang++-3.5 的错误没有帮助。我认为我得到的最接近的是:
但是clang仍然抱怨:
c++ - 带有可变参数模板的模板模板参数
为了清楚起见,我从下面删除了构造函数和析构函数等内容,它们不会向问题添加任何内容。我有一个基类,用于为派生模板类创建一个共同的祖先。
所以现在我有 2 个模板类,每个都派生自同一个祖先类,一个包含一个包含类型 A 的向量,另一个包含类型 B;每个都有不同的模板参数。到目前为止,一切都很好。
现在来回答这个问题。我希望能够创建一个容器模板,其中不包含一个或多个 PeripheralSystem 的派生版本,我想我可以使用可变参数模板来做到这一点,但我有点坚持过去一天左右的语法。在编译时,我希望能够创建容器类的实例。也许是这样的:
我知道我使用的可变参数格式不正确,因为我得到:
错误:模板参数列表模板<模板类参数...>中的预期','或'>'
我想告诉编译器的是我想为模板提供可变数量的模板类型参数,每个参数都有可变数量的模板参数。请问我可以用可变参数模板做到这一点吗?请对正确的语法有任何建议吗?
c++ - 如何不指定模板模板(+模板)参数的内部模板
如何使以下代码编译?
GCC-4.8.2 抱怨:
实际的问题是,当代码中的唯一更改是注释时,如何允许调用者指定在函数内部使用哪个特征线性代数求解器(例如http://eigen.tuxfamily.org/dox/classEigen_1_1BiCGSTAB.html )从另一行:
目前该功能开始为:
,我不希望调用者也必须给 Eigen::SparseMatrix ,或者只给
作为模板参数。
c++ - 模板模板参数默认可以引用其他模板类型参数吗?
我正在尝试执行以下操作:
但是 Visual Studio 2010 编译器会吐出:
错误 C3202:“AA”:模板参数“”的默认参数无效,应为类模板
如果我将 B 替换为以下模板:
代码编译得很好,但不是我想要的。如果原件不是合法的 C++,是否有替代方案为“B”模板的用户提供类似的界面?
c++ - 匹配任何类型参数的 C++ 可变参数模板模板参数
我想知道是否可以编写一个模板函数,它可以将任何其他任意模板作为参数并正确匹配模板名称(即不仅仅是生成的类)。我所知道的工作是这样的:
例如,这将匹配f(std::vector<int>())
orf(std::list<int>())
但不适用于f(std::array<int, 3>())
,因为第二个参数是 asize_t
并且没有类型。
现在我想一个人可以做一些疯狂的事情,比如:
希望编译器能够正确导出TemplateP
省略号或Sizes
省略号为空。但它不仅丑陋,而且仍然适用于采用类型或size_t
参数的模板。它仍然不会匹配任意模板,例如带有bool
参数的模板。
重载方法也是如此:
此外,如果我们想混合size_t
和typenames
. 因此,匹配任何内容所需的内容将是这样的,其中对省略号中允许的内容完全没有限制:
该语法不起作用,但也许还有其他语法来定义这样的东西?
这主要是我想知道语言中可能有什么,认为它实际上可能有用,如果您有不同的模板,其中第一个参数始终是固定的,并且您想根据返回类型更改它并保留其他所有内容. 像这样的东西:
那么,有什么方法可以使用模式匹配以完全通用的方式完成这项工作?
这不仅仅是一个思想实验,因为我被困住的用例是创建在容器上运行的纯函数原语,并将隐式构造不可变的结果容器。如果结果容器具有不同的数据类型,我们需要知道容器操作的类型,因此对任何容器的唯一要求是模板的第一个参数需要是输入类型,以便可以用不同的类型替换结果中的输出类型,但是代码应该忽略之后出现的任何模板参数,并且不应该关心它是类型还是值。
c++ - 扩展模板参数包班级
假设我有一些模板类定义如下
我需要定义一个别名模板,将 define_template::type 替换为 my_class 所以对于三个类我可以这样做
我无法为可变参数模板计算出执行此操作的语法,理想情况下是这样的
这给了我一个错误“参数包没有用'...'扩展
有人知道正确的语法吗?
从下面的评论来看,它在 clang 中编译,我通过 Cygwin 使用 gcc 4.8.2。