Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Тела методов в объявлении класса — кошмар номер один.
bool *ok вместо ссылки, напоминание о старом — добром C — кошмар номер два.
Потоку надо бы сигнал послать, а не убивать его.
void f(bool *ok = 0)
{
//тут возникла ошибка
if (ok)
*ok = false;
return;
}
//далее в коде
bool ok = false;
f(&ok);
bool ok;
func(&ok);
такой трюк не пройдет.Так почему бы нам просто не завести два метода, один — игнорирующий ошибку, второй — возвращающий ее.
// in std::map
pair<iterator,bool> insert (const value_type& val);
почему это плохо?
Сравните кол-во программистов на скриптовых языках и C++, готовых заниматься вебом.
Сравните стоимость добавления фичи.
вопрос профита
std::list<int> list;
//заполняем
for (int &x : list) {
//что-то делаем
}
for (std::unordered_map<std::string, std::list<std::string> >::iterator *it = foo.begin(); it != foo.end(); it++)
for(auto &it:foo)
{
}
Что тут ужасного?////////// Эта часть как правило вынесена в h[pp] файл/////////////////////////////////////////////////
typedef std::unordered_map<std::string, std::list<std::string> > storage_t;
typedef storage_t::iterator iter_t;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// в результате имеем:
for (iter_t it = foo.begin(); it != foo.end(); ++it)
По ссылке на документацию от автора статьи единственный пример и уже без наследования.
Another way to make code run in a separate thread, is to subclass QThread and reimplement run(). For example: [...]
банально каждый new может кинуть исключение когда сервак упрётся в память
class Worker : public QObject
{
public:
cppcms::service service;
}
int main()
{
QThread t;
Worker *w = new Worker;
w->moveToThread();
t.start();
}
использовать этот механизм не получилось (сигналы и слоты вне QEventLoop не работают, а блокирующего API у QNetworkReply нет)
В таких ситуациях я запускаю через QtConcurrent::run, а результат получаю через QFuture::result.
Конечно, Magic bytes не дают никаких гарантий, что остальное содержимое файла соответствует формату, но тут уж ничего не поделаешь.Насколько мне известно, с этим принято справляться путём перекодирования изображения из одного формата в тот же самый. Т.е. само изображение не меняется, а все лишние добавления пропадают. А если ImageMagick (libjpeg конкретно для JPEG, т.к. ImageMagick непременно пересожмёт изображение) не может что‐то перекодировать, то это не изображение и можно смело показывать пользователю ошибку.
Нужно воспользоваться методом load, но он принимает в качестве параметра std::istreamВроде в таких случаях (когда есть строка, а нужен поток) используют std::stringstream, ибо проще (у него прямо в конструкторе аргументом строка).
Как вам, кстати, пятая версия этого чудного фреймворка?
Да, возможности местами скромнее, но значит ли это, что ODB вовсе не подходит для ORM?
part = new Part()
part.name = "Sample part"
part.price = 123.45
part.save()
part = new Part()
part.name = "Sample part"
part.price = 123.45
save(part)
#pragma db object
class employer
{
...
#pragma db id
std::string name_;
};
#pragma db object
class employee
{
...
#pragma db id
unsigned long id_;
std::string first_name_;
std::string last_name_;
shared_ptr<employer> employer_;
#pragma db not_null
shared_ptr<employer> current_employer_;
#pragma db value_not_null
std::vector<shared_ptr<employer> > previous_employers_;
};
...
// Create an employer and a few employees.
//
unsigned long john_id, jane_id;
{
shared_ptr<employer> er (new employer ("Example Inc"));
shared_ptr<employee> john (new employee ("John", "Doe"));
shared_ptr<employee> jane (new employee ("Jane", "Doe"));
john->employer_ = er;
jane->employer_ = er;
transaction t (db.begin ());
db.persist (er);
john_id = db.persist (john);
jane_id = db.persist (jane);
t.commit ();
}
...
// Load a few employee objects and print their employer.
//
{
session s;
transaction t (db.begin ());
shared_ptr<employee> john (db.load<employee> (john_id));
shared_ptr<employee> jane (db.load<employee> (jane_id));
cout << john->employer_->name_ << endl;
cout << jane->employer_->name_ << endl;
t.commit ();
}
Полноценный веб-сайт на C++ и немного диванной аналитики