Приведение функций с аргументами-указателями к указателям на функции с аргументом void*C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Приведение функций с аргументами-указателями к указателям на функции с аргументом void*

Сообщение Anonymous »

Следующий код принимается GCC, и полученный двоичный файл выводит ожидаемые результаты. Но соответствует ли это стандарту и всегда ли будет работать в разных системах с использованием разных компиляторов?
Минимальный пример

Код: Выделить всё

#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;
}
Актуальная проблема:
Я реализую интерпретатор forth, который имеет словарь (не std::map), который сопоставляет слова forth с функциями реализации. Используемый указатель на функцию имеет следующий интерфейс:

Код: Выделить всё

export using execution_token_t = error_status(*)(environment& env, void* data) noexcept;
Было бы удобно, если бы зарегистрированные функции могли иметь конкретный тип в качестве второго параметра вместо указателя void. Передаваемые данные могут быть чем угодно. Вот в качестве примера две реальные реализации слов:

Код: Выделить всё

    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 определяется как std::intptr_t, чтобы избежать ненужной путаницы ;-)
Я ищу решение с нулевыми издержками.

Подробнее здесь: https://stackoverflow.com/questions/798 ... id-argumen
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»