【问题标题】:Restrictions for partial template specialization部分模板特化的限制
【发布时间】:2021-12-27 23:20:48
【问题描述】:

下面是一个学习元编程的简单示例,它检查目标类型是否包含在可变参数模板参数中。

template<typename... Arguments> // Generic form
struct AnyOf;

template<typename Target, typename First, typename... Arguments>
struct AnyOf<Target, First, Arguments...> {
  constexpr static bool value = std::is_same<Target, First>::value || AnyOf<Target, Arguments...>::value;
};

template<typename Target, typename Last>
struct AnyOf<Target, Last> : std::false_type {
};

template<typename Target>
struct AnyOf<Target, Target> : std::true_type {
};

template<typename Target>
struct AnyOf<Target> : std::false_type {
};

该解决方案似乎按预期工作,实施肯定可以改进。

有一件事我不明白, 如果模板声明的通用/主要形式被替换为

template<typename Target, typename First, typename... Arguments>
struct AnyOf {
  constexpr static bool value = std::is_same<Target, First>::value || AnyOf<Target, Arguments...>::value;
};

最后的偏特化

template<typename Target>
struct AnyOf<Target> : std::false_type {
};

无法编译。

https://en.cppreference.com/w/cpp/language/partial_specialization 总结了部分模板专业化的五个限制,似乎没有一个适用于此。

问题:部分模板特化导致编译失败的限制是什么?

【问题讨论】:

  • 主节点接受的最少个参数是多少?专业化是否与该模式匹配,并且是该模式的特例?

标签: c++ templates metaprogramming


【解决方案1】:

这似乎在标准中未得到充分说明;没有明确的语言要求部分特化实际上必须匹配主要的。

但是,“部分特化应比主模板更特化”([temp.spec.partial.general]/9.2) 条款似乎适用,因为模板参数列表 &lt;typename Target&gt; 并不比 template&lt;typename Target, typename First, typename... Arguments&gt; 更特化;如果两个模板参数列表在特化关系下不可比较,那么肯定没有一个比另一个更特化。

【讨论】:

  • 非常感谢,我明白了。
猜你喜欢
  • 2011-10-30
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多