extern "C"
GetUserNameW
.Advapi32.lib
.LNK2001 unresolved external symbol
и переходим по первой ссылке, которая снова, внезапно, по невероятному стечению обстоятельств оказывается документацией Microsoft.#pragma comment(lib, "Advapi32")
.#include <string>
#include <string_view>
#include <ranges>
#include <array>
#include <utility>
#include <algorithm>
#include <cassert>
#include <stdexcept>
template <typename Key, typename Value, std::size_t Size>
struct Map {
std::array<std::pair<Key, Value>, Size> data;
constexpr Value at(const Key key) const {
const auto iter = std::find_if(std::begin(data), std::end(data),
[&key](const auto& v) { return v.first == key; });
if (iter == std::end(data)) {
throw std::range_error("unknown character");
}
return iter->second;
}
};
static constexpr std::array<std::pair<std::string_view, char>, 51> MORSE_MAP = { {
{"•-", 'A'}, {"-•••", 'B'}, {"-•-•", 'C'}, {"-••", 'D'},
{"•", 'E'}, {"••-•", 'F'}, {"--•", 'G'}, {"••••", 'H'},
{"••", 'I'}, {"•---", 'J'}, {"-•-", 'K'}, {"•-••", 'L'},
{"--", 'M'}, {"-•", 'N'}, {"---", 'O'}, {"•--•", 'P'},
{"--•-", 'Q'}, {"•-•", 'R'}, {"•••", 'S'}, {"-", 'T'},
{"••-", 'U'}, {"•••-", 'V'}, {"•--", 'W'}, {"-••-", 'X'},
{"-•--", 'Y'}, {"--••", 'Z'}, {"-----", '0'}, {"•----", '1'},
{"••---", '2'}, {"•••--", '3'}, {"••••-", '4'}, {"•••••", '5'},
{"-••••", '6'}, {"--•••", '7'}, {"---••", '8'}, {"----•", '9'},
{"•-•-•-", '.'}, {"--••---", ','}, {"---•••", ':'}, {"••--••", '?'},
{"•----•", '\''}, {"-••••-", '-'}, {"-••-•", '/'}, {"-•--•", '('},
{"-•--•-", ')'}, {"•-••-•", '"'}, {"-•••-", '='}, {"•-•-•", '+'},
{"-••-", 'x'}, {"•--•-•", '@'}, {"/", ' '} } };
constexpr auto decode(std::string_view morse) {
constexpr auto map = Map<std::string_view, char, MORSE_MAP.size()>{ MORSE_MAP };
return morse
| std::ranges::views::split(' ')
| std::ranges::views::transform([](auto&& range) {
return map.at(std::string_view{ range });
})
| std::ranges::to<std::string>();
}
int main() {
const auto CODE = "•••• • •-•• •-•• --- --••--- / •-- --- •-• •-•• -••";
const auto TEXT = "HELLO, WORLD";
assert(decode(CODE) == TEXT);
return 0;
}
fopen_s
внезапно не сможет открыть файл и вернёт ошибку. Допустим, файла не существует, или на его открытие нет прав у пользователя. Ты же не проверяешь возврат результата из функции открытия и пытаешься что-то записать в F, даже если функция не смогла открыть файл и вернула ошибку. А когда она вернёт её, переменная F останется нулевыем указателем или, в первом твоём случае, вообще будет обращение к неинициализированной переменной, где ты получишь неопределённое поведение. Вот оно и ругается на эту ветку развития событий./std:c++latest
и кодить себе спокойно. Это лучший, быстрый и самый беспроблемный вариант. при этом под полиморфизмом понимается динамический полиморфизм
инкапсуляция (то есть в C++ это будет выражено классом с private и public функциями-членами)
private
и public
. А скорее про интерфейс и его сокрытую реализацию.class Widget {
public:
void add(shared_ptr<Widget> child);
};
auto root = make_shared<Widget>();
root->add(root); // о_О шта?
мы не знаем в данном месте кода, какой это именно виджет, но нам нужно вызвать draw, который может быть разным в зависимости от типа виджета
Вы скажете, что virtual call быстрее switch
От vector'а не рекомендуется наследоваться
Я не вижу тут необходимости в классах. Той редкой ситуации, как было с теми виджетами, когда у нас есть указатель непонятно на что, тут нет. Так что наследование и полиморфизм тут не нужны
Подскажите как это лучше всего сделать с использованием только стандартных библиотек C++?
std::streambuf
вызывается виртуальный метод overflow(), вот его перегружаете, проходите по буферу, делаете нужные вам изменения и сбрасываете буфер дальше на запись. Примерно, как тут.#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
int main() {
std::ofstream out_file( "out.txt" );
std::ifstream in_file( "in.txt" );
std::string/*stream*/ some_buffer;
using char_type = decltype(out_file)::char_type;
using in_iter = std::istream_iterator< char_type >;
if ( !in_file.is_open() || !out_file.is_open() )
return EXIT_FAILURE;
std::transform(in_iter(in_file), in_iter(), std::ostream_iterator< char_type >(out_file),
[&some_buffer] (const char_type &c) {
if ( !std::isalpha( static_cast<unsigned char>(c) ) || c == '\n' || c == '\r' )
return ' ';
// if шило, then мыло, буферизуем если надо, и т. п.
return c;
});
return EXIT_SUCCESS;
}
int var; int *pvar;
. Несмотря на то, что сумма размеров этих переменных на стеке sizeof(int) + sizeof(int*) = 12
для x86_64, выделяется 16 байт согласно пункту 3.2.2 SystemV ABI AMD64, который говорит, что стековый фрейм должен быть выровнен по границе 16 байт. На другой архитектуре здесь может быть другое правило.samp *ob;
ob = &func();