Мне нужно было сортировать типы в кортеже по выравниванию, и в результате я просто хочу получить новый тип кортежа. < /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++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как протестировать создание экземпляра вне функции с исправлением в Python
Anonymous » » в форуме Python - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как протестировать создание экземпляра вне функции с исправлением в Python
Anonymous » » в форуме Python - 0 Ответы
- 7 Просмотры
-
Последнее сообщение Anonymous
-