Функция с использованием std::any и void*C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Функция с использованием std::any и void*

Сообщение Anonymous »

Учитывая приведенный ниже код (выполняется по адресу https://godbolt.org/z/rEK1MEMxf):

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

#include "catch2/catch_all.hpp"

#include 
#include [*]
#include 
#include 

namespace AsyncPointer {

std::list pointers;

void push(const std::any &pointer) {
pointers.push_back(pointer);
}

void pushWithVoid(void *ptr) {
std::any pointer = ptr;
pointers.push_back(pointer);
}

template  T *get() {
auto pointerIt = std::find_if(pointers.begin(), pointers.end(),
[](const std::any &ptr) {
return ptr.type() == typeid(T*);
});
if (pointerIt != pointers.end()) {
return std::any_cast(*pointerIt);
}
return nullptr;
}
}

TEST_CASE("Async-pointer should work properly", "[asyn-pointer]") {
int a0 = 0;
float a1 = 1.0;
double a2 = 2.0;
AsyncPointer::push(&a0);
AsyncPointer::push(&a1);
AsyncPointer::pushWithVoid(&a2);
int *b0 = AsyncPointer::get();
float *b1 = AsyncPointer::get();
double *b2 = AsyncPointer::get();

REQUIRE(&a0 == b0);
REQUIRE(&a1 == b1);
REQUIRE(&a2 == b2);
}
И учитывая, что цели:
  • Функция push должна хранить указатели по типу.
    • Пыталась использовать набор вместо списка, но безуспешно из-за std::any.
  • Функция get должна захватывать указатели по своим type.
У меня есть несколько вопросов:
  • Почему pushWithVoid не работает должным образом (REQUIRE(&a2 == b2) не работает)?
  • Как изменить push, чтобы он принимал только указатели вместо std::any?
    • Следует ли использовать вместо этого std::shared_ptr?
  • Почему я не могу разделить на два файла (заголовок и реализацию) функцию get?
    • Когда я это делаю, компилятор выдает "main.cc:(.text+0x1580): неопределенную ссылку на `int* game::AsyncPointer::get()'", для пример.


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

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

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

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

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

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