Pull to refresh
0
0
Send message
int i;
char c;
byte b;
string s;
vector v;
pointer p;
argument a1;


Как-то я работал над таким проектом, где у объектов были такие именна в функции с парочкой вложенных циклов и ифов. Структура кода не сказать, что была бы сложная, но когда доходишь глазами до нижнего уровня уже забываешь что таакое «i», приходиться возвращаться в начало, а там забываешь откуда ты перешел. Внятное имя решило бы эту проблему.
Возьми в проект огромный boost, занимающий несколько гигабайт места на SSD диске

ну во-первых про несколько гб это сильное преувеличение. Ыо-вторых велосипедостроение это плохо, а ведь действительно написал один костыл — избежал буста, в след. раз: «А вроде буст и не нужен же сейчас, двайте еще велосипед запилим» и так много раз — код сложнее и костыльнее. В-третьих открой для себя уже bcp. В-четвертых regex — часть stl уже давно.
здесь небольшое улучшение этого шаблона, «на 95% безопасно»=)
Да, это статический полиморфизм. Нельзя использовать коллекцию базовых объектов, нельзя вернуть ссылку/указатель на базовый объект из некой функции, но реально ссылающуюся на разные объекты в зависимости от разных условий и вызвать у нее потом некий метод например тот же Do(). Да, этого нельзя. Это ограничения статического полиморфизма, но быть полиморфным код выше от этого не перестал.
#include <iostream>
#include <type_traits>

#define HAS_MEM_FUNC(func, name)                                        \
    template<typename T, typename Sign>                                 \
    struct name {                                                       \
        typedef char yes[1];                                            \
        typedef char no [2];                                            \
        template <typename U, U> struct type_check;                     \
        template <typename _1> static yes &chk(type_check<Sign, &_1::func > *); \
        template <typename   > static no  &chk(...);                    \
        static bool const value = sizeof(chk<T>(0)) == sizeof(yes);     \
    }

HAS_MEM_FUNC(Do, has_do);




template<class T>
class IA
{
public:
	void Do()
	{

		static_assert(has_do<T, void(T::*)()>::value, "Derived class has no Do function");
		static_cast<T*>(this)->Do();
	}
protected:
	IA() {}
	IA(const IA&) {}
	IA(IA&&) {}
protected:
};


template<class WorkingClass>
void RunDo(IA<WorkingClass>& p)
{
	p.Do();
}

class C : public IA<C>
{

};




class B : public IA<B>
{
public:
	void Do()
	{
		std::cout << "I'm B!!!" << std::endl;
	}
};


int main()
{
	B b;
	RunDo(b);
	C c;
//	RunDo(c);
//	IA<B> ia;
//	RunDo(ia);
}
Без модулей плохо.
Теперь каждый раз нужно лезть в класс, и смотреть, а нет ли у него move semantics внутри, чтобы знать, что этот класс нельзя использовать после копирования foo&.


Мне кажется вы не поняли move сементику. Проблемы никакой нет. Прочитайте еще раз до полного просветления.
А где еще модулям и рефлексии быть?

Information

Rating
Does not participate
Registered
Activity