Мне нужно было сортировать типы в кортеже по выравниванию, и в результате я просто хочу получить новый тип кортежа. < /p>
написал некоторую реализацию. Но в одном случае (при использовании постоянного auto sort_tuple (auto tuple) ) GCC и Clang дают ошибку, а в другом случае (при использовании большинства функций в качестве лямбда) MSVC дает ошибку, но в другом месте для (казалось бы,) по -разному. Код (Godbolt): < /p>
#include
#include
#include
#include
#include
using Index = std::size_t;
using Alignment = std::size_t;
struct Key {
Index old;
Alignment a;
};
template struct Elem {};
template
struct Map : Elems... {
static constexpr auto size = sizeof...(Elems);
};
template
struct Tuple {
static constexpr auto size = sizeof...(Ts);
};
struct alignas(2) s_1 {};
struct alignas(2) s_2 {};
struct alignas(2) s_3 {};
struct alignas(2) s_4 {};
using T1 = Tuple;
#define CLANG_GCC_DONT_WORK
//#define MSVC_DOESNT_WORK_BUT_DIFFERENT_PLACE
#if defined(CLANG_GCC_DONT_WORK)
consteval auto sort_tuple(auto tuple)
{
#elif defined(MSVC_DOESNT_WORK_BUT_DIFFERENT_PLACE)
using Sorted = decltype([]() consteval {
auto tuple = T1{};
#endif
constexpr auto size = [](::Tuple&){
return sizeof...(Ts);
}(tuple);
constexpr auto unsorted = []<
typename ...Ts,
auto ...Is
>(::Tuple&, std::index_sequence&&){
return std::array{Key{Is, alignof(Ts)}...};
}(tuple, std::make_index_sequence{});
using Unsorted = decltype([](
::Tuple&, std::index_sequence&&
){
return ::Map<
Elem...
>{};
}(tuple, std::make_index_sequence{}));
constexpr auto sorted = [](auto unsorted){
std::sort(
unsorted.begin(), unsorted.end(),
[](const auto& lhs, const auto& rhs){
return lhs.a > rhs.a;
}
);
return unsorted;
}(unsorted);
// gcc and clang complaining here
// (when using CLANG_GCC_DONT_WORK macro),
// I'm using trick with template argument deduction,
// and those, it seems, can't deduce
//
// also "sorted" std::array passed as template parameter,
// but when passing it through capture
// all compilers give error at this place
using Sorted = decltype([](
std::index_sequence&&
){
return ::Tuple<
decltype([](
[[maybe_unused]] ::Elem&& deduced_by_compiler
){
return T{};
}.template operator()(Unsorted{}))...
>{};
}.template operator()(std::make_index_sequence{}));
return Sorted{};
#if defined(CLANG_GCC_DONT_WORK)
};
using Sorted = decltype(sort_tuple(T1{}));
#elif defined(MSVC_DOESNT_WORK_BUT_DIFFERENT_PLACE)
}());
#endif
int main() {}
< /code>
so: < /p>
Это ошибка компиляторов или все в соответствии со стандартом? Рабочая реализация такой сортировки в C ++ 20 и ниже, я был бы признателен, если вы связываете ее в комментариях или что -то в этом роде
Подробнее здесь: https://stackoverflow.com/questions/797 ... le-using-d
Что является объяснением/исправлением для ошибки компилятора при сортировке типов корзины с использованием Decltype, лям ⇐ C++
Программы на C++. Форум разработчиков
1754851152
Anonymous
Мне нужно было сортировать типы в кортеже по выравниванию, и в результате я просто хочу получить новый тип кортежа. < /p>
написал некоторую реализацию. Но в одном случае (при использовании постоянного auto sort_tuple (auto tuple) ) GCC и Clang дают ошибку, а в другом случае (при использовании большинства функций в качестве лямбда) MSVC дает ошибку, но в другом месте для (казалось бы,) по -разному. Код (Godbolt): < /p>
#include
#include
#include
#include
#include
using Index = std::size_t;
using Alignment = std::size_t;
struct Key {
Index old;
Alignment a;
};
template struct Elem {};
template
struct Map : Elems... {
static constexpr auto size = sizeof...(Elems);
};
template
struct Tuple {
static constexpr auto size = sizeof...(Ts);
};
struct alignas(2) s_1 {};
struct alignas(2) s_2 {};
struct alignas(2) s_3 {};
struct alignas(2) s_4 {};
using T1 = Tuple;
#define CLANG_GCC_DONT_WORK
//#define MSVC_DOESNT_WORK_BUT_DIFFERENT_PLACE
#if defined(CLANG_GCC_DONT_WORK)
consteval auto sort_tuple(auto tuple)
{
#elif defined(MSVC_DOESNT_WORK_BUT_DIFFERENT_PLACE)
using Sorted = decltype([]() consteval {
auto tuple = T1{};
#endif
constexpr auto size = [](::Tuple&){
return sizeof...(Ts);
}(tuple);
constexpr auto unsorted = []<
typename ...Ts,
auto ...Is
>(::Tuple&, std::index_sequence&&){
return std::array{Key{Is, alignof(Ts)}...};
}(tuple, std::make_index_sequence{});
using Unsorted = decltype([](
::Tuple&, std::index_sequence&&
){
return ::Map<
Elem...
>{};
}(tuple, std::make_index_sequence{}));
constexpr auto sorted = [](auto unsorted){
std::sort(
unsorted.begin(), unsorted.end(),
[](const auto& lhs, const auto& rhs){
return lhs.a > rhs.a;
}
);
return unsorted;
}(unsorted);
// gcc and clang complaining here
// (when using CLANG_GCC_DONT_WORK macro),
// I'm using trick with template argument deduction,
// and those, it seems, can't deduce
//
// also "sorted" std::array passed as template parameter,
// but when passing it through capture
// all compilers give error at this place
using Sorted = decltype([](
std::index_sequence&&
){
return ::Tuple<
decltype([](
[[maybe_unused]] ::Elem&& deduced_by_compiler
){
return T{};
}.template operator()(Unsorted{}))...
>{};
}.template operator()(std::make_index_sequence{}));
return Sorted{};
#if defined(CLANG_GCC_DONT_WORK)
};
using Sorted = decltype(sort_tuple(T1{}));
#elif defined(MSVC_DOESNT_WORK_BUT_DIFFERENT_PLACE)
}());
#endif
int main() {}
< /code>
so: < /p>
Это ошибка компиляторов или все в соответствии со стандартом? Рабочая реализация такой сортировки в C ++ 20 и ниже, я был бы признателен, если вы связываете ее в комментариях или что -то в этом роде
Подробнее здесь: [url]https://stackoverflow.com/questions/79731435/what-is-explanation-fix-for-compilers-error-when-sorting-types-of-tuple-using-d[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия