class Res
{
public:
Res() = default;
Res(MYSQL_RES* x) : fD(x) {}
Res(const Res&) = delete;
Res(Res&& x) { operator = (std::move(x)); }
Res& operator = (const Res& x) = delete;
Res& operator = (Res&& x);
~Res() { close(); }
const MYSQL_RES& d() { return *fD; }
void close();
bool next();
std::wstring tableName() const;
const char* at(size_t i) const { return fRw[i]; }
private:
MYSQL_RES* fD = nullptr;
MYSQL_ROW fRw = nullptr;
};
Obj* p = new Obj;
…
delete obj;
u_p<Obj> p { new Obj };
// И делай с ним что хочешь, удалится автоматически
u_p<ImportIssues> getImportIssues();
class Father{
public:
virtual ~Father();
};
class Son : public Father{};
class AnotherSon : public Father{};
u_p<Father> someObj { new Son };
std::vector<std::unique_ptr<QThread>> backJobs;
typedef bool SymbolBoolMap[16][15];
static SymbolBoolMap symbol_Bool_Map_English_Upper_A = { ... };
[const] SymbolBoolMap&
.#include <iostream>
template <class T>
struct Array
{
const size_t size;
const T* const data;
const T* begin() const { return data; }
const T* end() const { return data + size; }
constexpr Array(const std::initializer_list<T>& x)
: size(x.size()), data(x.begin()) {}
};
using Row = Array<int>;
using Matrix = Array<Row>;
Matrix mtx = {
{1, 2, 3 },
{ 10, 20, 30, 40, 50 },
{},
{ 100 }
};
int main()
{
for (auto& u : mtx) {
for (auto& v : u) {
std::cout << v << ' ';
}
std::cout << std::endl;
}
return 0;
}
#include <iostream>
// Изменяемый вариант
template <class T>
struct Array2
{
const size_t size;
T* const data;
T* begin() { return data; }
T* end() { return data + size; }
const T* begin() const { return data; }
const T* end() const { return data + size; }
T& operator[](int i) { return data[i]; }
template <size_t N>
constexpr Array2(T (&x)[N])
: size(N), data(x) {}
};
using Row2 = Array2<int>;
using Matrix2 = Array2<Row2>;
int main()
{
int i;
std::cin >> i;
int row1[] = { 1, i, 3 };
int row2[] = { 10, 2*i, 30, 3*i, 50 };
int row3[] = { 13 };
int row4[] = { 100 };
Row2 mtx[] = { row1, row2, row3, row4 };
mtx[1][4] = i * 6;
for (auto& u : mtx) {
for (auto& v : u) {
std::cout << v << ' ';
}
std::cout << std::endl;
}
return 0;
}
mov ecx, [data]
mov byte ptr[ecx], 5
class ConStream : public st::Stream
{
public:
ConStream();
~ConStream() override;
bool open(
const std::wstring& aFname,
const std::wstring& aCmdLine,
const std::wstring& aLog);
// Console does not have remainder.
st::Pos remainder() override { return 0; }
// Only when we bumped into end.
size_t eof() override { return fIsEof; }
size_t readNe (void* aBuf, size_t aSize) override;
size_t writeNe(const void* aBuf, size_t aSize) override;
void flush() override;
bool isOpen() override { return fIsOpen; }
bool readln(std::string& s);
void endInput();
// Shall we implement close?
//void close() override {}
// Implemented capabilities
unsigned long caps() const override
{ return st::cRead | st::cWrite | st::cMultiplex | st::cRealtime
| st::cSizeUnaware; }
private:
st::AsyncFile fLog;
bool fIsOpen = false;
bool fIsEof = false;
bool fFoundCr = false;
STARTUPINFO si;
PROCESS_INFORMATION pi;
HANDLE hStdOutInside, hStdOutOutside;
HANDLE hStdInInside, hStdInOutside;
//HANDLE hStdErrInside, hStdErrOutside;
//bool readln(std::string& s);
};
ConStream::ConStream()
{
SECURITY_ATTRIBUTES sa;
// Security attributes
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = nullptr;
sa.bInheritHandle = true; // Help says the handle will be inherited
SECURITY_DESCRIPTOR sd;
if (isWinNT()) { // security initialization for Windows NT
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, true, nullptr, false);
sa.lpSecurityDescriptor = &sd;
}
// Stdout pipe
// read = outside, write = inside
CreatePipe(&hStdOutOutside, &hStdOutInside, &sa, 0);
SetHandleInformation(hStdOutOutside, HANDLE_FLAG_INHERIT, 0);
// Stderr pipe
// read = outside, write = inside
//CreatePipe(&hStdErrOutside, &hStdErrInside, &sa, 1024*64); // enough for stderr?
//SetHandleInformation(hStdErrOutside, HANDLE_FLAG_INHERIT, 0);
// Stdin pipe
// read = inside, write = outside
CreatePipe(&hStdInInside, &hStdInOutside, &sa, 1024*10);
SetHandleInformation(hStdInOutside, HANDLE_FLAG_INHERIT, 0);
}
void ConStream::endInput()
{
if (hStdInOutside != INVALID_HANDLE_VALUE) {
CloseHandle(hStdInOutside);
hStdInOutside = INVALID_HANDLE_VALUE;
}
}
ConStream::~ConStream()
{
if (fIsOpen) {
if (WaitForSingleObject(pi.hProcess, 2000) == WAIT_TIMEOUT) {
TerminateProcess(pi.hProcess, 0);
}
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
CloseHandle(hStdInInside);
endInput();
//CloseHandle(hStdErrOutside);
//CloseHandle(hStdErrInside);
CloseHandle(hStdOutOutside);
CloseHandle(hStdOutInside);
}
bool ConStream::open(
const std::wstring& aFname,
const std::wstring& aCmdLine,
const std::wstring& aLog)
{
if (fIsOpen)
return false;
// Fill startup info
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
size_t n = aFname.length() + aCmdLine.length() + 10;
si.dwFlags |= STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.hStdOutput = hStdOutInside;
si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
si.hStdInput = hStdInInside;
si.wShowWindow = SW_HIDE;
std::wstring ws;
ws.reserve(n);
ws += L'"';
ws += aFname;
ws += L"\" ";
ws += aCmdLine;
fIsOpen = CreateProcess(
nullptr, // lpApplicationName
&*ws.begin(), // lpCommandLine
nullptr, // lpProcessAttributes
nullptr, // lpThreadAttributes
TRUE, // bInheritHandles
0, // dwCreationFlags
nullptr, // lpEnvironment
nullptr, // lpCurrentDirectory
&si, // lpStartupInfo
&pi ); // lpProcessInformation
if (fIsOpen && !aLog.empty())
fLog.open(aLog.c_str(), st::File::omNew);
return fIsOpen;
}
void ConStream::flush()
{
}
size_t ConStream::readNe (void* aBuf, size_t aSize)
{
if (!fIsOpen)
return 0;
DWORD nRead;
if (!ReadFile(hStdOutOutside, aBuf, static_cast<DWORD>(aSize), &nRead, nullptr))
return 0;
if (fLog.isOpen())
fLog.write(aBuf, nRead);
return nRead;
}
// Implemented write
size_t ConStream::writeNe(const void* aBuf, size_t aSize)
{
if (!fIsOpen)
return 0;
DWORD nWritten;
if (!WriteFile(hStdInOutside, aBuf, static_cast<DWORD>(aSize), &nWritten, nullptr))
return 0;
return nWritten;
}
bool ConStream::readln(std::string& s)
{
if (!fIsOpen)
return false;
s.clear();
enum { SZ = 256, TIME = 30 };
char buf[SZ + 2];
DWORD nRead, nm1, nm2;
while (true) {
if (!PeekNamedPipe(hStdOutOutside, buf, SZ, &nRead, &nm1, &nm2))
throwWinError();
// Read nothing — maybe, the program has finished?
if (nRead == 0) {
if (WaitForSingleObject(pi.hProcess, TIME) == WAIT_OBJECT_0) {
// Try again
if (!PeekNamedPipe(hStdOutOutside, buf, SZ, &nRead, &nm1, &nm2))
throwWinError();
if (nRead == 0)
return !s.empty();
// otherwise fall out
}
}
const char* start = buf;
const char* end = buf + nRead;
if (fFoundCr && *start == '\n') {
++start;
fFoundCr = false;
}
for (const char* p = start; p != end; ++p) {
switch (*p) {
case '\r':
fFoundCr = true;
// fall through
case '\n':
s.append(start, p);
// Read until CR
++p;
skipRead(p - buf);
return true;
default: ;
}
}
// Copy the entire buffer and go on
s.append(start, end);
skipRead(end - buf);
}
}
inline const char* wtc(const WCHAR *from)
{
//Используется буффер -- статическая переменная
static char buf[1024] = { 0 };
size_t nChars = std::min<size_t>(wcslen(from), 1024 - 1);
if (!CharToOemBuffW(from, buf, nChars)) {
cout << GetLastError();
exit(-1);
}
buf[nChars] = 0;
return buf;
}
Например, int занимает 4 байта
В случае с double можно задать абсолютно любое число
double x = 1e500;
для чего в конце приписывают 'f' ,когда пользуются типом данных float?
float x; return x + 12.34f
вёлся в менее точном типе float, а не double.float x = 12.34;
это совершенно не нужно, компилятор и сам поймёт, что преобразование double → float можно сделать при компиляции.Сколько бит(байт) занимают типы данных с плавающей запятой в C++?
types... t
— это любое количество параметров любых типов. Которые, в свою очередь, можно рекурсивно подставить в шаблон printTypes.DEF_TYPENAME(float)
— это использование препроцессора Си++ (никакой уже не 11), чтобы объявить несколько стандартных специализаций одного шаблона. #include <iostream>
template <class Body>
void call(const Body& body) {
body();
};
void test() {
std::cout << "function" << std::endl;
}
int main() {
call(test);
call([]() {
std::cout << "lambda" << std::endl;
});
return 0;
}
n := 10
yНовое := расчёт(n)
повтор
n := n·2
yСтарое := yНовое
yНовое := расчёт(n)
пока |yСтарое - yНовое| > эпсилон
вывести/вернуть yНовое