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总结了部分模板专业化的五个限制,但它们似乎都不适用。
问题:部分模板特化导致编译失败的限制是什么?
标准中似乎对此没有明确规定;没有明确的语言表明部分专业化必须实际上与主要专业化相匹配。
然而,“部分特化应比主模板更特化”([temp.spec.partial.general]/9.2)条款似乎适用,因为模板参数列表<typename Target>
并不比主模板更特化template<typename Target, typename First, typename... Arguments>
;如果两个模板参数列表在专业化关系下不具有可比性,那么肯定没有一个比另一个更专业。
归档时间: |
|
查看次数: |
156 次 |
最近记录: |