--- ([info]_zerg) wrote,
@ 2007-11-29 21:12:00
Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Entry tags:suxx

isDerived: feel difference
C++

class base { public: int i; };
class child : public base { public: int j; };
class other { public: int z; };

template <typename D, typename B>
class IsDerived
{
	struct No {}; struct Yes { No no[2]; };
	static Yes Test(B*);
	static No Test(...);

public: enum { Derived = sizeof(Test(static_cast<D*>(0))) == sizeof(Yes) };
};

template <class T>
bool function()
{
	if (IsDerived<T, base>::Derived == 1)
		return true;
	else
		return false;
}


int _tmain(int argc, _TCHAR* argv[])
{
	assert(true == function<base>());
	assert (true == function<child>());
	assert (false == function<other>());
	assert (false == function<int>());

	return 0;
}


C#
class Program
{
    class base_ { public int i; }
    class child : base_ { public int j; }
    class other { public int z; }

    static bool function<T>() where T : new()
    {
        T t = new T();
        if (t is base_)
            return true;
        else
            return false;
    }

    static void Main(string[] args)
    {
        Debug.Assert(true == function<base_>());
        Debug.Assert(true == function<child>());
        Debug.Assert(false == function<other>());
        Debug.Assert(false == function<int>());
    }
}



(Post a new comment)


[info]timai
2007-11-29 08:29 pm UTC (link)
Ну а в реальном рабочем( коммерческом ) коде тебе часто нужны такие изъёбы?
Даже если и действительно нужно, не проще сделать у базового класса виртуальный метод, который возвращает всю цепочку наследования( хоть в виде флагов тех же )?

(Reply to this)(Thread)


[info]_zerg
2007-11-30 05:11 pm UTC (link)
Ну вот кстати прямо сейчас в рабочем коде у меня есть такой изъеб. Издержки производства, но это реально облегчит "клиентский" по отношению к моему код.

А виртуальный базовый класс мне не поможет в данном случае, потому что у меня нет объекта и по любому придется его создавать. Я конечно понимаю, что на c# на это какой то похуй, но все же. Ну и базовый класс - это дополнительная фишечка для пользователя моего кода, которую он должен помнить и не забывать делать.

(Reply to this)(Parent)(Thread)


[info]timai
2007-11-30 05:17 pm UTC (link)
Перефразируя старую фразу:
ООП позволяет решать проблемы, которых до его возникновения даже не существовало.

(Reply to this)(Parent)(Thread)


[info]_zerg
2007-11-30 05:19 pm UTC (link)
Да нихуя. Мне вот вся это шутка на порядок упростила код.

(Reply to this)(Parent)


[info]whoozle
2008-09-02 02:45 am UTC (link)
Если честно, особой разницы не чувствую, но вижу что в c# на каждый IsDerived аллоцируется объект. В то время когда в c++ всё разворачивается на этапе компиляции :)

(Reply to this)(Thread)


[info]_zerg
2008-09-02 03:08 am UTC (link)
Да, именно =)

(Reply to this)(Parent)


Create an Account
Forgot your login?
Login w/ OpenID
English • Español • Deutsch • Русский…