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