2017-09-07 6 views
1
#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; 
} 

Je veux trouver l'index d'un type dans un std :: tuple, Pourquoi ce code ne peut pas compiler dans mingw64-gcc? Il semble me dire que le modèle récursif est trop profond. Quelle est la bonne façon de trouver un index de type dans std :: tuple? version de gcc 7.2.0, compilation avec std = C++ 17C++ Modèle récursif pour vérifier le type dans std :: tuple

Répondre

3

Vous avez besoin d'un else avant la deuxième condition et avant le return final:

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>(); } 
} 

Sans else, find_from<TupleType, T, index+1> sera toujours instancié même si les conditions précédentes ont été évaluées à true.

live example on wandbox

+1

@ Jarod42: merci, changé l'explication bâclée –

+0

obtenu, je comprends mal la compilation si –