无聊,瞎写

2018-09-13  本文已影响0人  iwtbam

以下内容瞎猜瞎写,不太懂java,懂点C++, 闲极无聊写点东西

学java的时候,看到java中函数参数的传递方式是按值传递,即使参数是对象,传递的也是对象的引用的拷贝,感觉比较有意思,这让我感觉Java中的对象,有点像C++中不能解引用的指针,并且java 中的对象基本都过new 在堆上操作的,又有种被阉割的C++的感觉。

所以,突然就想自己建立一个小的体系,来阉割一下C++, 模仿一下java,最后跑题了。

class Object
{
public:

    virtual std::string toString()
    {
        return std::string("Object");
    }
    virtual long long hasCode()
    {
        return -1;
    }   
    virtual void* clone()
    {
        return new Object {*this} ;
    }
    virtual int equals(void* obj)
    {
        return 0;
    }

    
};

这些方法徒有其形,意思意思而已。

class Object
{
public:

    template<typename... Args>
    static Object* create(Args... args)
    {
        return new Object{args...};
    }

    virtual std::string toString()
    {
        return std::string("Object");
    }

    virtual long long hasCode()
    {
        return -1;
    }   
    
    virtual void* clone()
    {
        return new Object {*this} ;
    }
    
    virtual int equals(void* obj)
    {
        return 0;
    }

protected:
    Object() = default;
    Object(const Object& obj) = default;
    Object& operator=(const Object&) = default;
    
};

开始跑题了

#define CREATE(cls) \
template<typename... Args> \
static cls* create(Args... args) \
{\
    return new cls{args...};\
}

#define DEFAULT(cls) \
cls() = default; \
cls(const cls&) = default;\
cls& operator=(const cls&) = default;
class Object
{
public:

    CREATE(Object)
    virtual std::string toString()
    {
        return std::string("Object");
    }

    virtual long long hasCode()
    {
        return -1;
    }   
    
    virtual void* clone()
    {
        return new Object {*this} ;
    }
    
    virtual int equals(void* obj)
    {
        return 0;
    }

protected:
    DEFAULT(Object)

};
class Integer extends Object
{
public:
    CREATE(Integer);

    int getValue() { return value; }
    void setValue(int value) { this->value = value; }
    
protected:

    Integer(int v)
    {
        value = v;
    }
    DEFAULT(Integer);

private:

    int value;
   

};
#define extends :public
#define interface class
#define import using namespace
template<typename T, bool val = has_create<T>::value>
struct Alloc
{
    template<typename... Args>
    static T* create(Args... args)
    {
        return T::create(args...);
    }
};

template<typename T>
struct Alloc<T, false>
{
    template<typename... Args>
    static T* create(Args... args)
    {
        return new T{args...};
    }
};
template<typename T>
class has_create
{
private:

    template<typename U>
    static auto check(int)-> decltype(U::create());

    template<typename U>
    static char check(...);

public:
    using value_type = bool;
    constexpr static bool value = std::is_same<T*, decltype(check<T>(0))>::value;
};

class A
{
};

class B
{
public:
    CREATE(B)
protected:
    DEFAULT(B);
};

int main()
{
    A* pa = Alloc<A>::create();
    B* pb = Alloc<B>::create();    
    return 0;

};

写着写着就跑题了,正好到了跑路时间,跑路,也正好把无聊时间打发了。

上一篇 下一篇

猜你喜欢

热点阅读