Mencegah Tuple keluar batas dengan if constexpr

Kode berikut dapat dikompilasi dengan baik dengan GCC dan Dentang tetapi berhenti berfungsi di pembaruan terkini untuk Visual Studio (/std:c++latest):

#include <tuple>

template<int pos, typename... T>
void check_tuple(T... types) {
    if constexpr (pos <= -1) {
        // nothing
    } else {
        using Type = typename std::tuple_element<pos, std::tuple<T...>>::type;
    }
}

int main() {
    check_tuple<0>(1.0, 1.0);
    check_tuple<-1>(1.0, 1.0);
}

Dalam versi terbaru Visual Studio (/std:c++latest), kompilasi gagal dengan indeks tuple di luar batas (std::tuple_element‹18446744073709551613,std::tuple‹>>).

Apakah mungkin untuk mencegah Tuple keluar batas dengan constexpr seperti ini?


person Petter    schedule 15.12.2017    source sumber


Jawaban (1)


Ini adalah bug VS (harap lapor ke Microsoft). Kode harus berfungsi apa adanya.


Sampai saat itu tiba, Anda dapat menggunakan cara yang kami gunakan untuk mengatasi masalah ini: pengiriman tag.

template<int pos, typename... T>
void check_tuple_impl(std::true_type, T... types) {
    // nothing
}

template<int pos, typename... T>
void check_tuple_impl(std::false_type, T... types) {
    using Type = typename std::tuple_element<pos, std::tuple<T...>>::type;
}

template<int pos, typename... T>
void check_tuple(T... types) {
    check_tuple_impl<pos>(std::integral_constant<bool, (pos <= -1)>{}, types...);
}
person Barry    schedule 15.12.2017