Код: Выделить всё
#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