【发布时间】: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