Article View: pl.comp.lang.c
Article #310525Re: stała mapa enum -> wartość
From: JDX
Date: Wed, 13 Mar 2024 00:19
Date: Wed, 13 Mar 2024 00:19
76 lines
3841 bytes
3841 bytes
On 12.03.2024 08:23, heby wrote:
> On 12/03/2024 07:56, JDX wrote:
>> https://stackoverflow.com/questions/33374241/compile-time-lookup-table-for-enum. Zwłaszcza jedno zdanie zwróciło moją uwagę (o czym w zasadzie wiedziałem, ale jakoś nie przyszło mi to do głowy): „In C++14, your switch function could be constexpr, thanks to relaxed constexpr restrictions” – ja bym właśnie z constexpr spróbował się pobawić.
>
> Nie spradzałem tego konkretnego rozwiązania jeszcze, zerknę.
A ja z ciekawości właśnie sprawdziłem i wygląda na to, że działa. A w
bonusie jest zerowe zużycie pamięci (nie trzeba tablicy).
-----------------------------------------------------------------
// Kompilacja: g++ -std=c++20 -O3 -Wall -S testenum.cpp
#include <cstdint>
#include <type_traits>
enum class Foo : uint8_t { D, U, P, A };
struct Bar {
uint8_t a;
uint32_t b;
constexpr Bar(uint8_t _a, uint32_t _b) : a(_a), b(_b) {}
};
template<Foo> struct Foo2Bar;
// "Tablica" mapujaca Foo -> Bar
template<> struct Foo2Bar<Foo::D> : std::integral_constant<Bar,
Bar(7,3)> { };
template<> struct Foo2Bar<Foo::U> : std::integral_constant<Bar,
Bar(0,0)> { };
template<> struct Foo2Bar<Foo::P> : std::integral_constant<Bar,
Bar(2,3)> { };
template<> struct Foo2Bar<Foo::A> : std::integral_constant<Bar,
Bar(1,5)> { };
int footest()
{
// oczekiwana wartosc zwracana: 21
static_assert(
Foo2Bar<Foo::D>::value.a + Foo2Bar<Foo::D>::value.b +
Foo2Bar<Foo::U>::value.a + Foo2Bar<Foo::U>::value.b +
Foo2Bar<Foo::P>::value.a + Foo2Bar<Foo::P>::value.b +
Foo2Bar<Foo::A>::value.a + Foo2Bar<Foo::A>::value.b == 21, "");
return Foo2Bar<Foo::D>::value.a + Foo2Bar<Foo::D>::value.b +
Foo2Bar<Foo::U>::value.a + Foo2Bar<Foo::U>::value.b +
Foo2Bar<Foo::P>::value.a + Foo2Bar<Foo::P>::value.b +
Foo2Bar<Foo::A>::value.a + Foo2Bar<Foo::A>::value.b;
}
const Bar& bartest()
{
return Foo2Bar<Foo::D>::value;
}
-----------------------------------------------------------------
Dla typów prostych nie potrzeba -std=c++20. W każdym razie np. dla ARM-a
footest() wygląda tak:
.global _Z7footestv
.syntax unified
.arm
.type _Z7footestv, %function
_Z7footestv:
.fnstart
.LFB14:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
mov r0, #21
bx lr
.cantunwind
.fnend
.size _Z7footestv, .-_Z7footestv
Przy optymalizacji -O0 ładnie widać jak pracowicie są dodawane
poszczególne stałe.
Technical Details
Message-ID:
<usqrds$qke$1$jdx@news.chmurka.net>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.chmurka.net!.POSTED.ip-94-42-224-83.multimo.pl!not-for-mailReferences:
<usk0pv$2tak9$1@dont-email.me> <uslhop$tf6$1$Jaworski@news.chmurka.net> <usn89d$3me9n$1@dont-email.me> <usnat5$dmp$1$jdx@news.chmurka.net> <usnbua$3n64i$1@dont-email.me> <usouai$qsc$1$jdx@news.chmurka.net> <usovtu$5lca$1@dont-email.me>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.chmurka.net!.POSTED.ip-94-42-224-83.multimo.pl!not-for-mail From: JDX <jdx@onet.pl> Newsgroups: pl.comp.lang.c Subject: Re: stała mapa enum -> wartość Date: Wed, 13 Mar 2024 01:19:07 +0100 Organization: N/A Message-ID: <usqrds$qke$1$jdx@news.chmurka.net> References: <usk0pv$2tak9$1@dont-email.me> <uslhop$tf6$1$Jaworski@news.chmurka.net> <usn89d$3me9n$1@dont-email.me> <usnat5$dmp$1$jdx@news.chmurka.net> <usnbua$3n64i$1@dont-email.me> <usouai$qsc$1$jdx@news.chmurka.net> <usovtu$5lca$1@dont-email.me> NNTP-Posting-Host: ip-94-42-224-83.multimo.pl MIME-Version: 1.0 Injection-Date: Wed, 13 Mar 2024 00:19:08 -0000 (UTC) Injection-Info: news.chmurka.net; posting-account="jdx"; posting-host="ip-94-42-224-83.multimo.pl:94.42.224.83"; logging-data="27278"; mail-complaints-to="abuse-news.(at).chmurka.net" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:FctPVSFWf0lBl8xBsFfrciwICBc= sha256:LtK3GOXnvjHX73kVUAdXvSVAWQaLtk3HhFllcujeics= sha1:nZll4290p1sFIOOdKpVc/l3AqpQ= sha256:LM06+NbDdhq6tlGFIX4KVr+LQJbSBH0BpLOnuki9phw= In-Reply-To: <usovtu$5lca$1@dont-email.me> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit