Umwandlung von Funktionen mit Zeigerargumenten in Funktionszeiger mit dem Argument void*C++

Programme in C++. Entwicklerforum
Anonymous
 Umwandlung von Funktionen mit Zeigerargumenten in Funktionszeiger mit dem Argument void*

Post by Anonymous »

Der folgende Code wird von GCC akzeptiert und die resultierende Binärdatei gibt die erwarteten Ergebnisse aus. Aber ist es standardkonform und würde immer auf verschiedenen Systemen mit unterschiedlichen Compilern funktionieren?
Minimalbeispiel

Code: Select all

#include

using func_t = void(*)(void* data);

void int_func(int* data)
{
std::println("{}", *data);
}

void const_int_func(const int* data)
{
std::println("{}", *data);
}

void int_arry_func(int(&data)[2])
{
for (int elem : data)
std::println("{}", elem);
}

void const_int_arry_func(const int(&data)[2])
{
for (int elem : data)
std::println("{}", elem);
}

int main()
{
func_t func_1 = reinterpret_cast(int_func);
func_t func_2 = reinterpret_cast(const_int_func);
func_t func_3 = reinterpret_cast(int_arry_func);
func_t func_4 = reinterpret_cast(const_int_arry_func);

int val = 5;
int vals[2] = { 1, 2 };

func_1(& val);
func_2(& val);
func_3(vals);
func_4(vals);

return 0;
}
Eigentliches Problem:
Ich implementieren einen vierten Interpreter, der über ein Wörterbuch (nicht std::map) verfügt, das vierte Wörter Implementierungsfunktionen zuordnet. Dieser verwendete Funktionszeiger hat die folgende Schnittstelle:

Code: Select all

export using execution_token_t = error_status(*)(environment& env, void* data) noexcept;
Es wäre praktisch, wenn die registrierten Funktionen anstelle eines leeren Zeigers einen konkreten Typ als zweiten Parameter haben könnten. Die übergebenen Daten können alles Mögliche sein. Hier sind als Beispiel zwei tatsächliche Wortimplementierungen:

Code: Select all

    error_status create_rt(environment& env, void* data) noexcept
{
return env.dstack.push(reinterpret_cast(data));
}

error_status colon_rt(environment& env, void* data) noexcept
{
if (env.instruction_ptr)
{
if (const auto status = env.rstack.push(env.instruction_ptr); status != error_status::success)
return status;
}

env.instruction_ptr = static_cast(data) - 1;

return error_status::success;
}
int_t ist als std::intptr_t definiert, um unnötige Verwirrung zu vermeiden ;-)
Ich suche nach einer Lösung ohne Overhead.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post