и дёргать её, но наличие доп сущности восторг не вызывает. Может есть ещё какой вариант передать в parameter pack индексы без подобного (f_ok()) костыля?
Всем здрасьте.
Взял я boost::locale для операций с Юникодом, и пока не понял - а как удалить из строки знаки ударения (хотя там может быть и другой мусор однозначно). С наскоку сделал декомпозицию с case folding’ом - не помогает:
#include <boost/locale.hpp>
#include <iostream>
#include <string>
#include <locale>
using namespace boost::locale;
using namespace std;
int main() {
wstring str = L"фыва\u00b4"; // "фыва" с ударением на 'а'
generator gen;
locale::global(gen(""));
wstring res = normalize(str, boost::locale::norm_nfd);
fold_case(res);
cout << str.size() << " " << res.size() << endl;
}
// cout: 5 5
На стековерфлоу есть подобный вопрос, там советовали вручную парсить строку для поиска ударений, это явно странно. Как правильно?
Приветствую.
Гипотеза - на каждой нормальной клавиатуре, ориентированной на представителя любой культуры говорящего на любом языке на клавишах вторым рядом выбита латиница.
Как без заморочек о типах раскладок (всякие QWERTY и AZERTY) получить латинскую букву передав на вход что-то из нелатинской раскладки? Например:
Т.е. какая-то либа, которая спросит у системы тип клавиатуры, может раскладки, и даст ответ, на регистр можно забить и всегда выдавать в нижнем или верхнем.
Привет. Не могу понять, почему не получается заменить это:
#include <tuple>
#include <type_traits>
using namespace std;
template <typename Tuple, size_t i=0>
requires (i >= tuple_size_v<Tuple>)
consteval bool check_visitor() {
return true;
}
template < typename Tuple, size_t i=0>
requires (i < tuple_size_v<Tuple>)
consteval bool check_visitor() {
static_assert(! is_same_v<tuple_element_t<i, Tuple>, bool>);
return check_visitor<Tuple, i+1>();
}
int main() {
using T = tuple<int, double, char>;
check_visitor<T>();
}
на это:
#include <tuple>
#include <type_traits>
using namespace std;
template < typename Tuple, size_t i=0>
consteval bool check_visitor() {
static_assert(! is_same_v<tuple_element_t<i, Tuple>, bool>);
if constexpr (i < tuple_size_v<Tuple>)
return check_visitor<Tuple, i+1>();
else
return true;
}
int main() {
using T = tuple<int, double, char>;
check_visitor<T>();
}
Выражение в if constexpr зависит от параметров шаблона, как говорит справочник - в таком случае неактивная ветка должна полностью исчезнуть при инстанцировании, хоть ODR используй там необъявленное.
Привет.
Есть в виме terminal mode, мне вполне нравится, но есть одно но - отсутствует возможность отчистить терминальный буфер. В целом это не проблема - сделал так:
function Clear_terminal()
if winnr('$') == 1
let l:only_window = 1
else
let l:only_window = 0
endif
bd!
terminal
if only_window
only
endif
endfunction
function Terminal_started()
setlocal nonumber
nmap <buffer> <C-w>l :call Clear_terminal()<CR>
endfunction
augroup Mode_hooks_group
autocmd!
...
autocmd TerminalOpen * call Terminal_started()
augroup End
Но есть одна проблема - вызвать Clear_terminal() я могу лишь в нормальном режиме (внутри Terminal mode), в режиме ввода команд сделать этого никак не получается. Всякие наивные попытки вроде
tmap <C-w>l <C-w>N<C-w>l "выход в нормальный режим, а следом ввод <C-w>l для вызова функции
проваливаются, происходит выход в норм режим, а вторая часть этой комплексной команды игнорится. Как из режима вставки дёрнуть Clear_terminal()? Т.е одним нажатием <C-w>l без ручного выхода в норм режим.
Для примера возьмём адрес «https://www.wikipedia.org», который норм открывается в обозревателе, задача - сходить на него имея на руках его ip адрес (т.е. без обращения к dns).
$ dog www.wikipedia.org
CNAME www.wikipedia.org. 23h59m10s "dyna.wikimedia.org."
A dyna.wikimedia.org. 9m10s 91.198.174.192
$ ping 91.198.174.192
PING 91.198.174.192 (91.198.174.192) 56(84) bytes of data.
64 bytes from 91.198.174.192: icmp_seq=1 ttl=58 time=144 ms
Далее в адресной сроке обозревателя ввожу «https://91.198.174.192», получаю жалобу на невалидный сертифика (что ок и вопросов не вызвает), соглашаюсь с рисками и в итоге не получаю ожидаемую страницу. Не заканчиваются успехом и попытке вроде «91.198.174.192:443».
Привет, проблема в следующем - имеется проект, без оптимизаций всё нормально работает, с оптимизациями ГЦЦ выдаёт криво работающую поделку, шланг нормальную. Включил все возможные воринги - ничего серьёзного. Адресный санитайзер проблем не находит. -fsanitize=undefined - аналогично, но с ним ошибка пропадает и софтина работает годно.
Чувствую, что проблема в ГЦЦ, но как подступиться и состряпать баг репорт - не могу сообразить. Ну не слать же портянку в несколько К строк, кто там разбираться с ней будет. Можно ли ткнуть в какую-то сущность в коде и отседить производимые оптимизации над ней?
Совершенно случайно наткнулся, в стд появилась мега фича ssize()! После долгий метаний относительно signed/unsigned геморроя, сегодня решил - ну буду к каждому проекту присобачивать костылики - sigsize() и idx(), оказалось, что один костыль не нужен. Ещё бы такую перегрузку для контейнеров воткнуть:
operator[]( ptrdiff_t pos );
Жаль проблемы с неоднозначностью будут. Ладно, может чего придумают на этот счёт, ну а пока такое:
Имеется конкретная задача (хотелка) - передавать в конструктор brace list, автоматически выводитьс size_t параметра шаблона равный количеству членов листа, обойтись без макросов (с макросами знаю как). Т.е:
template <size_t Sz>
struct S {
S(...);
};
int main() {
array<int, 5> a;
S s{ {1,2,3} };
S s2(a);
}
Свои соображения:
Видимо задача должна сводится к написанию deduction гида, из brace list’a может быть выведен initializer_list (но не std::array, например). Метод initializer_list::size() - constexpr, по идее можно использовать для передачи аргументом в шаблонный парметр, но не выходит
#include <array>
#include <initializer_list>
using namespace std;
template <size_t U>
struct S {
S(array<int, U>) {}
};
S(initializer_list<int> l) -> S<l.size()>; // error, можно просто 3, тогда ок, в данном случае
int main() {
S s2{ {3,4,5} };
}
Есть такой вариант
template <size_t U>
struct S {
S(const int(&ar)[U]) {}
};
int main() {
array<int, 5> a;
S s2{ {3,4,5} }; #1
S s2(a); #2 error
}
Но не годится, т.к. #2 не работает. Как бы написать такой хитрый гид? Не вижу причин, которые бы делали невозможным использование компайл тайм инфы о размере std::initializer_list.
Нюанс в том, что незивестен точный тип лямбды, они приходят из пользовательского кода, следовательно мне неизвестны типы и количество аргументов, которые функтор ожидает, т.е. я не могу использовать invoke_result<>. Нужно заглянуть в класс, схватить любой оператор() и вернуть тип возврата. Получилось такое:
template <typename T>
struct Return_type;
template <typename R, typename... Args>
struct Return_type<R(Args...)> {using type = R;};
template <typename R, typename Q, typename... Args>
struct Return_type<R (Q::*)(Args...)const> {using type = R;};
template <typename R, typename Q, typename... Args>
struct Return_type<R (Q::*)(Args...)> {using type = R;};
struct A{
struct V {
double operator()(int t)const {return 5;}
};
};
int main() {
auto l = [](double a, int e)mutable{return 2;};
auto l2 = [](int a){;return 2;};
Return_type<decltype(&decltype(l)::operator())>::type a;
Return_type<decltype(&decltype(l2)::operator())>::type a2;
Return_type<decltype(&A::V::operator())>::type a3;
auto l3 = [](auto b){;return 2;};
Return_type<decltype(&decltype(l3)::operator())>::type a4;
return 0;
}
И в принципе свою задачу я решил, мне этого хватит, но не знаю как (и возможно ли вообще) получить тип от лямбды, внутри которой шаблонный оператор() (тот, что auto l3). Решаема ли задача в случае с l3?
Здрасьте. Чтобы не было путаницы в терминологии - под графемой понимаю что-то рисуемое на экране, занимаемое ровно одно знакоместо. Нужен алгоритм, который принимает на вход utf-8 строку и выдаёт на выходе число, которое равно количеству знакомест, которые занимает данная строка будучи отрисованной в терминале.
Но тут подстава со всякими управляющими символами, например Tab, котороый займет некоторое число знакомест, лазить в кишках terminfo для определения этого числа я точно не хочу. Решил поступить проще - итерироваться по символам и проверять является ли символ управляющим и если да, то менять его на пробел. И вот здесь встает вопрос - есть ли управляющие символы выше ASCII диапазона, которые могуть выдать что-то в терминал занимающее более одного знакоместа? Т.е. речь идёт о том, что делать ли std::iscntrl(char_sym, get_locale()) напрямую или конвертить предварительно всю последовательность в wchar_t и уже потом тестить. Естественно, что первое проще, а может второе и вовсе смысла не имеет. Управляющие символы там точно есть (U+2028, например), но рисуется в терминале одним знакоместом.
Я уже почти созрел до того, чтобы закрыть для себя вопрос юникода навсегда и остановиться лишь на в ASCII в софте, по крайней мере до момента, пока не появится адекватная либа, а не ICU. Была зыбкая надежда на boost.locale, но оказалось, что тот же U+2028 она не считет управляющим (тогда как локаль созданная дефолтными с++ средствами считает)