C ++ void *任何类型的实现都会返回奇怪的结果

我正在尝试使用anyC ++(object做一个基本的类型实现,但是CCCCCCCC如果我想从任何类型中获取值,它总是会打印出来,这使我感到困惑(尽管我确实知道void*s很危险):

#include <typeinfo>
struct object
{
private:
    template < typename T > struct _base
    {
        typedef T _ptr_type;
        _ptr_type* _ptr_val()
        {
            return _ptr;
        }
        _base(_ptr_type value) : _ptr(&value){}
        _base() : _ptr(nullptr){}
        _ptr_type* _ptr;
    };
    struct _holder : _base<void*>
    {
        template < typename Ty > void cast(const _base<Ty>* p_base)
        {
            _ptr->~_ptr_type();
            _ptr_type _n_type = (_ptr_type)p_base->_ptr, *_n_ptr = &_n_type;
            std::swap<_ptr_type*>(_ptr, _n_ptr);
        }
        _holder(){}
    };
public:
    _holder* _h_ptr;
    object() : _h_ptr(new _holder){}
    template < typename T > object(const T& value) : _h_ptr(new _holder)
    {
        _base<T> _t_base(value);
        _h_ptr->cast(&_t_base);
    }
    template < typename T > void operator=(const T& value)
    {
        _base<T> _t_base(value);
        _h_ptr->cast(&_t_base);
    }
    const void* operator()() const
    {
        return *_h_ptr->_ptr_val();
    }
};

#include <iostream>
int main()
{
    object MyObject = 'c';
    std::cout << MyObject();
    getchar();
}
约瑟夫

也许我对对象类的实现会为您提供帮助。它类似于boost::any,但具有更多功能(operator==operator!=

class object
{
private:
    class dummy
    {
    public:
        dummy()
        {
        }
        virtual ~dummy()
        {
        }
        virtual const std::type_info &type() const = 0;
        virtual dummy *duplicate() const = 0;
        virtual bool eq(object) = 0;
    };

    template < typename _Ty > class data : public dummy
    {
    public:
        data()
        {
        }

        data(const _Ty &_Value)
            : __data(_Value)
        {
        }

        ~data()
        {
        }

        const std::type_info &type() const
        {
            return typeid(_Ty);
        }

        data *duplicate() const
        {
            return new data<_Ty>(__data);
        }

        bool eq(object _Obj)
        {
            return _Obj.cast<_Ty>() == __data;
        }

        _Ty __data;
    };

    dummy *d;
public:
    object()
    {
    }

    template < typename _Ty > object(const _Ty &_Value)
        : d(new data<_Ty>(_Value))
    {
    }

    object(const object &_Obj)
        : d(_Obj.d->duplicate())
    {
    }

    ~object()
    {
        if (!empty())
        {
            delete d;
        }
    }

    const std::type_info &type() const
    {
        return (empty() ? typeid(void) : d->type());
    }

    object &operator=(object &_Rhs)
    {
        if (&_Rhs != this)
        {
            d = _Rhs.d->duplicate();
        }
        return *this;
    }

    object &swap(object &_Rhs)
    {
        std::swap(*this, _Rhs);
        return *this;
    }

    template < typename _Ty > object &operator=(const _Ty &_Value)
    {
        d = new data<_Ty>(_Value);
        return *this;
    }

    template < typename _Ty > _Ty cast() const
    {
        if (type() == typeid(_Ty))
        {
            return static_cast<data<_Ty> *>(d)->__data;
        }
        throw std::exception("Invalid cast type");
    }

    bool operator==(const object &_Rhs) const
    {
        return (type() == _Rhs.d->type() ? d->eq(_Rhs) : false);
    }

    template < typename _Ty > bool operator==(_Ty _Value) const
    {
        return (type() == typeid(_Ty) ? cast<_Ty>() == _Value : false);
    }

    bool operator!=(const object &_Rhs) const
    {
        return !(*this == _Rhs);
    }

    template < typename _Ty > bool operator!=(_Ty _Value) const
    {
        return !(*this == _Value);
    }

    bool empty() const
    {
        return !d;
    }
};

恐怕就像boost::any,没有getter函数,而是一个cast函数。可以这样使用

int main()
{
    object o = 5;
    object o = (std::string)"Hello\n"; // doesn't like arrays, must be wrapped in a class
    std::cout << o.cast<std::string>().c_str();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从具有'void'返回类型的函数中获取结果,而结果变量是输入参数之一-C ++

来自分类Dev

C ++:从void函数返回void函数的返回值

来自分类Dev

忽略void作为C ++中的函数结果

来自分类Dev

分配给void委托的lambda是否在C#中丢弃非void返回类型?

来自分类Dev

C++ 覆盖 void 函数返回类型导致构建失败

来自分类Dev

C ++,参数类型(void *&)的用途是什么?

来自分类Dev

检查C中void *指向的指针类型

来自分类Dev

类型转换(* void []到向量C ++)

来自分类Dev

检查C中void *指向的指针类型

来自分类Dev

在目标C中对(void *)使用类型转换

来自分类Dev

C语言中的void函数返回什么?

来自分类Dev

void函数如何返回值?C ++

来自分类Dev

GCC:从 C 中的 void 函数返回语句

来自分类Dev

void **等于void *返回?

来自分类Dev

void **等于void *返回?

来自分类Dev

有没有办法在不使用void指针的情况下返回C函数中的任何类型?

来自分类Dev

OpenGL C ++类型为void的参数与类型为void(*)()的参数不兼容

来自分类Dev

如果我们不从c ++中的非void返回类型的函数返回任何内容,返回值是多少?[实验性]

来自分类Dev

从void函数返回到另一个void函数在C ++中合法吗?

来自分类Dev

C ++作为返回值的const常量比“ void”更“ const void”吗?

来自分类Dev

从void函数返回void函数

来自分类Dev

C ++从类型'void *'强制转换为类型'double'

来自分类Dev

类型“ void *”的集合元素不是Objective-C对象

来自分类Dev

当不确定类型是什么时,C ++会抛出void *

来自分类Dev

在C ++ / CLI中将void *取消引用为基本类型

来自分类Dev

声明类型为void C ++的函数数组

来自分类Dev

不完整类型'void'不可分配c

来自分类Dev

如何定义宏函数返回void,否则在C ++中

来自分类Dev

C中的void函数指针返回值

Related 相关文章

  1. 1

    从具有'void'返回类型的函数中获取结果,而结果变量是输入参数之一-C ++

  2. 2

    C ++:从void函数返回void函数的返回值

  3. 3

    忽略void作为C ++中的函数结果

  4. 4

    分配给void委托的lambda是否在C#中丢弃非void返回类型?

  5. 5

    C++ 覆盖 void 函数返回类型导致构建失败

  6. 6

    C ++,参数类型(void *&)的用途是什么?

  7. 7

    检查C中void *指向的指针类型

  8. 8

    类型转换(* void []到向量C ++)

  9. 9

    检查C中void *指向的指针类型

  10. 10

    在目标C中对(void *)使用类型转换

  11. 11

    C语言中的void函数返回什么?

  12. 12

    void函数如何返回值?C ++

  13. 13

    GCC:从 C 中的 void 函数返回语句

  14. 14

    void **等于void *返回?

  15. 15

    void **等于void *返回?

  16. 16

    有没有办法在不使用void指针的情况下返回C函数中的任何类型?

  17. 17

    OpenGL C ++类型为void的参数与类型为void(*)()的参数不兼容

  18. 18

    如果我们不从c ++中的非void返回类型的函数返回任何内容,返回值是多少?[实验性]

  19. 19

    从void函数返回到另一个void函数在C ++中合法吗?

  20. 20

    C ++作为返回值的const常量比“ void”更“ const void”吗?

  21. 21

    从void函数返回void函数

  22. 22

    C ++从类型'void *'强制转换为类型'double'

  23. 23

    类型“ void *”的集合元素不是Objective-C对象

  24. 24

    当不确定类型是什么时,C ++会抛出void *

  25. 25

    在C ++ / CLI中将void *取消引用为基本类型

  26. 26

    声明类型为void C ++的函数数组

  27. 27

    不完整类型'void'不可分配c

  28. 28

    如何定义宏函数返回void,否则在C ++中

  29. 29

    C中的void函数指针返回值

热门标签

归档