Этот шаблон функции должен возвращать первый элемент типа X из кортежа с помощью функции индексации, но он не компилируется.
template<class X, class F, class... R>
constexpr X getByType(tuple<F, R...> t) {
if (is_same<F,X>::value) {
return get<0>(t); //ERROR POSITION
}
if (sizeof...(R) == 0) {
throw 4;
}
return get_vector<X>(tail(t));
}
int main() {
int i = get<int>(make_tuple(4.2,"assaaa",4));
}
Компилятор говорит, что он не может привести двойное значение к int. Первый элемент этого кортежа - двойной. Я предполагаю, что причина в том, что условие if остается оценивать во время выполнения. Как я могу выполнить условный возврат первого элемента кортежа во время компиляции?





Если ваш компилятор не поддерживает constexpr-если, вам нужно вынести некоторую логику во вспомогательный struct.
Пример реализации (безусловно, можно было бы реализовать более эффективно):
template<class X, class... List>
struct find_first;
template<class X, class... List>
struct find_first<X, X, List...> { static const int value = 0; };
template<class X, class Y, class... List>
struct find_first<X, Y, List...> { static const int value = find_first<X, List...>::value + 1; };
template<class X, class... R>
constexpr X getByType(tuple<R...> t) {
return get<find_first<X,R...>::value>(t);
}
Похоже на хороший вариант использования constexpr_if