我正在定义一种方法来了解类型在类型列表中的位置,使用 C++17 中的递归模板。我尝试了两种方法:一种使用 constexpr 值,另一种使用 constexpr 函数。第二个 usingif
语句编译,而第一个 using 三元运算符不编译。
#include <type_traits>
#include <iostream>
template<typename Searching, typename First, typename...Others>
constexpr std::size_t index_of = std::is_same_v<Searching,First> ? 0 : 1 + index_of<Searching,Others...>;
template<typename Searching, typename First, typename...Others>
constexpr std::size_t IndexOf() {
if constexpr(std::is_same_v<Searching,First>)
return 0;
else return 1 + IndexOf<Searching,Others...>();
};
int main() {
std::cout << index_of<int, int> << std::endl; //does not compile
std::cout << IndexOf<int, int>() << std::endl; //compile
//both should return 0
return 0;
}
我的编译器 migw64 说:
模板参数的数量错误(1,应至少为 2)
constexpr std::size_t index_of = std::is_same_v<Searching,First> ?0 : 1 + index_of<正在搜索,其他...>;
据我了解,三元运算符需要评估它的两个操作数,所以它不能用于这种类型的递归。
我对吗 ?如果是,为什么会这样?
谢谢你。