Информация об изменениях

Сообщение Re[5]: Тип sizeof от 11.03.2020 8:47

Изменено 11.03.2020 9:02 Alexander G

Re[5]: Тип sizeof
Здравствуйте, _NN_, Вы писали:


_NN>В общем выяснилось, что анализатор не умеет делать подстановки constexpr функций



Ну тогда через Integer Type Selection вотктнуть нужный тип:

template<std::size_t N>
struct constant_size { static const typename boost::uint_value_t<N>::least value = N; };

struct variable_size { std::size_t value; };

template<class T, std::size_t N>
constant_size<T> size(T (&v) [N]) { return {}; }

template<class T>
variable_size  size(T (&v)) 
{
    return { std::end(v) - std::begin(v) };
}

...

size(a).value;
Re[5]: Тип sizeof
Здравствуйте, _NN_, Вы писали:


_NN>В общем выяснилось, что анализатор не умеет делать подстановки constexpr функций



Ну тогда через Integer Type Selection вотктнуть нужный тип:

template<std::size_t N>
struct constant_size { static const typename boost::uint_value_t<N>::least value = N; };

struct variable_size { std::size_t value; };

template<class T, std::size_t N>
constant_size<T> size(T (&v) [N]) { return {}; }

template<class T>
variable_size  size(T (&v)) 
{
    return { std::end(v) - std::begin(v) };
}

...

size(a).value;


boost::uint_value_t может быть реализован без constexrp функций на std::conditional

template<std::size_t N>
struct uint_value_t
{
   typedef typename std::conditional<
        (N < 256), 
            std::uint8_t, 
            std::conditional<(N < 65536), 
                std::uint16_t, 
                ... > >::type least;
}