Size: a a a

2020 June 23

A

Alex Ф-ф-фэils!🌠︙... in pro.cxx
Апи вроде бы было у него для этого
источник
2020 June 24

I

Ivan in pro.cxx
Парни, а есть ли способ опционального инстанциирования класса в compile-time?
Мне нужно инстанциировать класс Average внутри одного TU, чтобы в других TU можно было писать extern template class Average для типов int32_t, int64_t, uint32_t, uint64_t и size_t.
Основная проблема в том, что size_t может быть одним из тех типов, а может и не быть ни одним из них (на разных платформах, в т.ч. и мобильных, на разных тулчейнах).
Вот первая попытка  https://godbolt.org/z/rZ7H4c добавить stub-instantiation Average<void> и использовать его только в случае столкновения с одним из тех *_t типов.
Но тут происходит бяка c clang'ом, который ругается, что класс инстанциируется дважды. Подавление warningов не вариант решения.
Было бы здорово, в случае collision'а просто не иметь template class Average<SizeOrVoid>;, типа как-нибудь enable_if'нуть его хитро. У кого-нибудь есть идеи?
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Ivan
Парни, а есть ли способ опционального инстанциирования класса в compile-time?
Мне нужно инстанциировать класс Average внутри одного TU, чтобы в других TU можно было писать extern template class Average для типов int32_t, int64_t, uint32_t, uint64_t и size_t.
Основная проблема в том, что size_t может быть одним из тех типов, а может и не быть ни одним из них (на разных платформах, в т.ч. и мобильных, на разных тулчейнах).
Вот первая попытка  https://godbolt.org/z/rZ7H4c добавить stub-instantiation Average<void> и использовать его только в случае столкновения с одним из тех *_t типов.
Но тут происходит бяка c clang'ом, который ругается, что класс инстанциируется дважды. Подавление warningов не вариант решения.
Было бы здорово, в случае collision'а просто не иметь template class Average<SizeOrVoid>;, типа как-нибудь enable_if'нуть его хитро. У кого-нибудь есть идеи?
Нужно на этапе препроцессора достать размер size_t
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
И обернуть макросом
источник

IZ

Ilia Zviagin in pro.cxx
Ivan
Парни, а есть ли способ опционального инстанциирования класса в compile-time?
Мне нужно инстанциировать класс Average внутри одного TU, чтобы в других TU можно было писать extern template class Average для типов int32_t, int64_t, uint32_t, uint64_t и size_t.
Основная проблема в том, что size_t может быть одним из тех типов, а может и не быть ни одним из них (на разных платформах, в т.ч. и мобильных, на разных тулчейнах).
Вот первая попытка  https://godbolt.org/z/rZ7H4c добавить stub-instantiation Average<void> и использовать его только в случае столкновения с одним из тех *_t типов.
Но тут происходит бяка c clang'ом, который ругается, что класс инстанциируется дважды. Подавление warningов не вариант решения.
Было бы здорово, в случае collision'а просто не иметь template class Average<SizeOrVoid>;, типа как-нибудь enable_if'нуть его хитро. У кого-нибудь есть идеи?
Опционально инстанциировать класс ==просто опционально компилировать часть кода.

Есть, #if и if constexpr
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Ilia Zviagin
Опционально инстанциировать класс ==просто опционально компилировать часть кода.

Есть, #if и if constexpr
if constexpr не подойдет тут
источник

I

Ivan in pro.cxx
Artöm Bakri Al-Sarmini
Нужно на этапе препроцессора достать размер size_t
Не думаю, что там одним размером можно обойтись. Там могут быть встроенные intrinsic типы с хитрым alignment'ом, так что extern template class обломается
источник

I

Ivan in pro.cxx
В случае size_t
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Еще идея есть, сек
источник

IZ

Ilia Zviagin in pro.cxx
Artöm Bakri Al-Sarmini
if constexpr не подойдет тут
Почему?
источник

I

Ivan in pro.cxx
Ilia Zviagin
Почему?
if constexpr умеет быть на namespace level?
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
struct size_t_tag;
template <>
class Average<size_t_tag> {};

// uint32_t и прочее
template class Average<std::conditional_t<is_one_of_v<size_t, uint32_t, прочие_типы...>, size_t_tag, size_t>;
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Ilia Zviagin
Почему?
Потому что явное инстанцирование происхохдит вне скоупа функции
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Artöm Bakri Al-Sarmini
struct size_t_tag;
template <>
class Average<size_t_tag> {};

// uint32_t и прочее
template class Average<std::conditional_t<is_one_of_v<size_t, uint32_t, прочие_типы...>, size_t_tag, size_t>;
Тег для красоты, можно было использовать воид
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Ivan
Парни, а есть ли способ опционального инстанциирования класса в compile-time?
Мне нужно инстанциировать класс Average внутри одного TU, чтобы в других TU можно было писать extern template class Average для типов int32_t, int64_t, uint32_t, uint64_t и size_t.
Основная проблема в том, что size_t может быть одним из тех типов, а может и не быть ни одним из них (на разных платформах, в т.ч. и мобильных, на разных тулчейнах).
Вот первая попытка  https://godbolt.org/z/rZ7H4c добавить stub-instantiation Average<void> и использовать его только в случае столкновения с одним из тех *_t типов.
Но тут происходит бяка c clang'ом, который ругается, что класс инстанциируется дважды. Подавление warningов не вариант решения.
Было бы здорово, в случае collision'а просто не иметь template class Average<SizeOrVoid>;, типа как-нибудь enable_if'нуть его хитро. У кого-нибудь есть идеи?
enable_if в явном инстанцировании типа это хард еррор, не поможет
источник

I

Ivan in pro.cxx
Artöm Bakri Al-Sarmini
struct size_t_tag;
template <>
class Average<size_t_tag> {};

// uint32_t и прочее
template class Average<std::conditional_t<is_one_of_v<size_t, uint32_t, прочие_типы...>, size_t_tag, size_t>;
is_one_of это же из 17 стандарта((
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Ivan
is_one_of это же из 17 стандарта((
Нет такого в стд
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Это нужно самому написать, но это несложно
источник

I

Ivan in pro.cxx
А что такое wrap_t?
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
На 11 рекурсивной специализацией, на 14 и выше без рекурсии можно
источник