C++模板递归检查std :: tuple中的类型

问题描述:

#include <iostream> 
#include <tuple> 
#include <type_traits> 

template<typename TupleType, typename T, std::size_t index = 0> constexpr std::size_t find_from(){ 
    if constexpr (index == std::tuple_size_v<TupleType>) return index; 
    if constexpr (std::is_same_v<std::tuple_element_t<index, TupleType>, T>) return index; 
    return find_from<TupleType, T, index+1>(); 
} 

int main(){ 
    std::cout << find_from<std::tuple<int,double>, int, 0>()<< std::endl; 
} 

我想在std :: tuple中找到一个类型的索引,为什么这个代码不能在mingw64-gcc中编译?它似乎告诉我模板递归太深。什么是在std :: tuple中查找类型索引的正确方法? gcc版本7.2.0,编译-std = C++ 17C++模板递归检查std :: tuple中的类型

你需要的第二个条件之前else和之前的最后return

template<typename TupleType, typename T, std::size_t index = 0> 
constexpr std::size_t find_from() 
{ 
    if constexpr (index == std::tuple_size_v<TupleType>) { return index; } 
    else if constexpr (std::is_same_v<std::tuple_element_t<index, TupleType>, T>) { return index; } 
    else { return find_from<TupleType, T, index+1>(); } 
} 

没有elsefind_from<TupleType, T, index+1>将始终实例即使先前的条件评估为true

live example on wandbox

+1

@ Jarod42:谢谢,改变了草率的解释 –

+0

得到了它,我误解了如果编译时间 –