Показать сообщение отдельно
  #10 (permalink)  
Старый 06.06.2013, 18:59
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от DjDiablo
ну ты перегнул насчёт пяти лет помоему.
Если:
Сообщение от DjDiablo
касается основных конструкций то их можно ну скажем за неделю выучить.
Конечно можно и за год нахвататься опыта, но на изучение тонкостей языка и компиляторов уйдут годы. Вспомни только работу с фасетами, тредами, локалями, потоками и STL .

к примеру финт с потоками:

struct log final : public std::ostream {
	public:
		explicit log(const std::string &type, const std::string &file = "") :
			std::ostream(new buffer(type, file)) {}
		;

		~log() {
			delete std::ostream::rdbuf();
		}

	private:
		struct buffer final : public std::stringbuf {
			public:
				explicit buffer(const std::string &type, const std::string &file) :
					type (type), file (file) {}
				;

				~buffer() {
					std::streambuf::pubsync();
				}

				virtual int sync();

			private:
				const std::string type, file;
			}
		;

		log(const log&) = delete;
		const log& operator=(const log&) = delete;
	}
;


Использую для того чтобы писать красиво в лог:

using LOG_INFO = ::log;
LOG_INFO ("error", (*error)->name) << "file: " << (*file)->name;

Или еще пример:

template <typename T>
struct find_equal : std::binary_function <T, T, bool>
{
	find_equal(const T &value) : value(value) {};

	bool operator()(const T &left, const T &right) const {
		return left == value && right == value;
	}

	private:
		T value;
};

Используется как предикат:
file.erase(std::unique(file.begin(), file.end(), ::find_equal<char>(' ')), file.end());

Хотя сейчас std::binary_function <...> deprecated, потому что можно писать так:

file.erase(std::unique(file.begin(), file.end(), [](const char &left, const char &right) {
     return left == value && right == value;
}), file.end());


Попробуй все это объяснить новичку.
Даже на самый простой вопрос чем отличаются union, struct, class не каждый ответит, особенно если не читал С++11, к примеру:

union __union final {
    const int i;
};
 
using foo = const union ::__union;
foo un = { .i =  0 };

std::cout << un.i << std::endl; // 0


Пруф

Ну и на последок прикоюха с перечислениями:
enum __enum : int { value = 0 };
std::cout << __enum.value << std::endl; // 0


Пруф

Сообщение от DjDiablo
Для продакшн конечно придётся в библиотеках разбираться в том же MFC хотя бы.
MFC, WF, WPF, Qt и пр. boost-подобные библиотеки это уже отдельная история.

Сообщение от DjDiablo
Так что я несогласен с отсутствием логики.
Ну к примеру по какой такой логике имя функции нужно оборачивать в круглые скобки:

void *(*foo)(int *);


Я понимаю если бы там было бы обращение к другим членам класса типа:
(*parent)->method.property


Ну или здесь:

using buffer = std::istreambuf_iterator<char>;
content.assign((buffer(file)), buffer());


Сейчас я понимаю почему это сделано так, но это нужно еще принять )

Или вот приколюха из нового стандарта:
i++++++++++; // i += 5;


Ну или вместо того чтобы добавить std::lexical_cast<...>() они добавили:

stoi, stol, stoll, stoul, stoull, stof, stod, stold, to_string, to_wstring к имеющимся strtod, strtold, strtof, strtoul, strtoull, trtol, strtoll, atoi, atol, atoll

спрашивается нафига?

Последний раз редактировалось monolithed, 11.06.2013 в 13:51.
Ответить с цитированием