Я пытаюсь реализовать класс с функциональностью std :: any.Более того, я решил избавиться от аналога std :: any_cast, если это возможно, поэтому я могу просто получить доступ к значению, хранящемуся в экземпляре класса, без явного указания его типа при выполнении доступа.
Я попытался использовать ключевое слово typedef
, поскольку оно позволяет переопределять псевдоним типа, однако, когда конструктор или область действия operator=
закрываются, тип возвращается к void *
.
Есть ли у вас какие-либо идеи?о том, как можно было бы реализовать что-то вроде этого?
То, что у меня есть на данный момент, примерно так:
#include <iostream>
#include <vector>
#include <string>
class any
{
public:
any(){}
template<typename T>
any(const T&& other) : _ptr(new T(std::forward<const T>(other))), t(1)
{
typedef T _type;
bool b = *(_type*)_ptr == other;
_type tmp = *(_type*)_ptr;
}
template<typename T>
void operator=(const T&& other)
{
typedef T _type;
if(_ptr) delete _ptr;
_ptr = new T(std::forward<const T>(other));
}
bool operator==(const any&& rval) const
{
try {
return *(_type*)_ptr == *(_type*)rval._ptr ? true : false;
}
catch (...)
{
return false;
}
}
bool operator==(const any& lval) const
{
try {
return *(_type*)_ptr == *(_type*)lval._ptr ? true : false;
}
catch (...)
{
return false;
}
}
friend std::ostream& operator<<(std::ostream& os, any& val);
auto val()
{
auto a = *(_type*)_ptr;
return a;
}
operator bool()
{
return _ptr ? true : false;
}
~any()
{
delete _ptr;
}
typedef void* _type;
private:
void * _ptr;
};
std::ostream& operator<<(std::ostream& os, any& val)
{
os << val.val();
return os;
}
Ну, я могу просто определить функцию any_cast для классаоднако, это не то, чем я занимаюсь в своих исследовательских целях.
Любой совет будет оценен.