【问题标题】:Linked template template parameters - constraining the inner parameter to be the same链接模板模板参数 - 约束内部参数相同
【发布时间】:2015-11-05 15:48:58
【问题描述】:

我有一些代码大量使用模板类。在这一点上,更改现有代码库是可能的,但不是可取的。我需要编写一个新类,它将作用于两个模板类(就这个问题而言)是任意的,除了有一个通用的模板参数。一个简化的例子:

template<typename T>
class A {
    // Implementation details
};

template<typename T>
class B {
    // Implementation details
};

template<typename T, typename X<T>, typename Y<T>> // This syntax is invalid!
class C {
    // Implementation details
};

我需要写课程C。示例中显示的语法暗示了我想要做什么但不起作用。此处的模板参数XY 必须通过采用相同的模板参数T 来“绑定在一起”。除此之外,它们可以是任意的。

这意味着“类似”C&lt;std::string,A&lt;std::string&gt;,B&lt;std::string&gt;&gt; 应该是有效的,但 C&lt;std::string,A&lt;std::string&gt;,B&lt;std::map&gt;&gt; 不应该是有效的,因为 AB 没有相同的模板参数。 (引号中的“like”再次表示上面C的声明语法仍然错误。)

其他尝试(也失败了)包括:

  • template&lt;typename T, template&lt;typename&gt; class X&lt;T&gt;, template&lt;typename&gt; class Y&lt;T&gt;&gt;
  • template&lt;typename T&gt; template&lt;typename X&lt;T&gt;, typename Y&lt;T&gt;&gt;

这样的事情可能吗?如果有,语法是什么?

谢谢!

【问题讨论】:

  • 只需使用template&lt;typename T, template&lt;typename&gt; class X, template&lt;typename&gt; class Y&gt;,然后在C 中的任何需要的地方使用X&lt;T&gt;Y&lt;T&gt;

标签: c++ class templates


【解决方案1】:

你可以部分专业化C

//Primary template
template<typename T, typename X, typename Y>
class C;

//Specialization for when the template parameters are the same
template<typename T, template <typename> class X, template <typename> class Y>
class C <T, X<T>, Y<T>> {
    // Implementation details
};

如果您随后使用无效的模板参数,您将收到编译时错误。

Live Demo

【讨论】:

  • 这个答案符合我的要求。通过更多的修改,我能够进一步改进它,以便用户不需要显式提供参数T。主模板为template&lt;typename X, typename Y&gt; class C,专业化为template&lt;template &lt;typename&gt; class X, template &lt;typename&gt; class Y, typename T&gt; class C&lt;X&lt;T&gt;, Y&lt;T&gt;&gt;
  • @Brick 这与答案有何不同?
  • @einpoklum 主模板少了一个参数,然后在整个过程中逐渐简化为更简单的代码。
  • 根据@einpoklum 的建议,我对这个答案发表了自己的评论。这比 TartanLlama 的原始版本略有改进。
【解决方案2】:

将评论扩展到 TartanLlama 接受的答案,我能够稍微改进这一点,从而减少一个模板参数。这会导致代码稍微简单一些。

主模板变为

template<typename X, typename Y> class C

专业是

template<template<typename> class X, template<typename> class Y, typename T> class C<X<T>, Y<T>>

这里的区别在于,与 TartanLlama 最初建议的相比,主模板没有额外的模板参数 T

【讨论】:

  • 是的,这绝对是一个进步:)
猜你喜欢
  • 2021-09-04
  • 2021-03-08
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 2019-11-22
  • 2022-01-22
  • 2021-11-18
  • 1970-01-01
相关资源
最近更新 更多