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

时间:2017-09-07 08:36:34

标签: c++ templates gcc template-meta-programming

#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 ++ 17进行编译

1 个答案:

答案 0 :(得分:3)

在第二个条件之前和最终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>(); }
} 

如果没有else,即使之前的条件评估为find_from<TupleType, T, index+1>true也会被实例化。

live example on wandbox