部分模板专业化的限制

Zho*_* Ma 5 c++ templates metaprogramming

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

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 {
};

Run Code Online (Sandbox Code Playgroud)

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

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

template<typename Target, typename First, typename... Arguments>
struct AnyOf {
  constexpr static bool value = std::is_same<Target, First>::value || AnyOf<Target, Arguments...>::value;
};
Run Code Online (Sandbox Code Playgroud)

最后的部分专业化

template<typename Target>
struct AnyOf<Target> : std::false_type {
};
Run Code Online (Sandbox Code Playgroud)

无法编译。

https://en.cppreference.com/w/cpp/language/partial_specialization总结了部分模板专业化的五个限制,但它们似乎都不适用。

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

eca*_*mur 3

标准中似乎对此没有明确规定;没有明确的语言表明部分专业化必须实际上与主要专业化相匹配。

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