Как стать автором
Обновить
2
0

Пользователь

Отправить сообщение
К «Ошибка №8: Взятие нескольких блокировок в разном порядке» ещё бы добавил использовать std::lock() на проектах до С++17
тут проблема в том, что _test должна быть глобальной и в отдельной переменной, и код типа:
std::cout << CString<"123456">::str << CString<_test>::psz;

просто не скомпилится.
Вот мой вариант без портянки вложенных шаблонов, но при этом с портянкой извлечения отдельных char'ов по индексу (до 128 символов):

#include <cstdlib>
#include <array>

template<char ... chars>
struct ct_string
{
    constexpr static size_t size()
    {
        return sizeof...(chars);
    }
    
    constexpr static auto get()
    {
        return std::array<char, size()>{ {chars ...} };
    }
    
    constexpr static auto to_string()
    {
        return std::string{chars ...};
    }
};


template<size_t N, typename T, char ...>
struct ct_maker_details;

template<size_t N, char ... chars, char first, char ... tail>
struct ct_maker_details<N, ct_string<chars...>, first, tail...>
{
    static constexpr auto make()
    {
        if constexpr(sizeof...(chars) == N)
            return ct_string<chars ...>{};
        else
            return ct_maker_details<N, ct_string<chars ..., first>, tail ...>::make();
    };
};

template<size_t N, char ... chars>
constexpr auto make_ct_string()
{
    return ct_maker_details<N, ct_string<>, chars...>::make();
};

template<size_t size>
constexpr size_t str_size(const char (&)[size])
{
    return size;
}

#define STR_TO_CHARS(str)  STR_TO_CHARS_(str, str_size(str))
#define STR_TO_CHARS_(str, N)  \
    str[IC(0, N)], str[IC(1, N)], str[IC(2, N)], str[IC(3, N)], str[IC(4, N)], str[IC(5, N)], str[IC(6, N)], str[IC(7, N)], str[IC(8, N)], str[IC(9, N)],  \
    str[IC(10, N)], str[IC(11, N)], str[IC(12, N)], str[IC(13, N)], str[IC(14, N)], str[IC(15, N)], str[IC(16, N)], str[IC(17, N)], str[IC(18, N)], str[IC(19, N)],  \
    str[IC(20, N)], str[IC(21, N)], str[IC(22, N)], str[IC(23, N)], str[IC(24, N)], str[IC(25, N)], str[IC(26, N)], str[IC(27, N)], str[IC(28, N)], str[IC(29, N)],  \
    str[IC(30, N)], str[IC(31, N)], str[IC(32, N)], str[IC(33, N)], str[IC(34, N)], str[IC(35, N)], str[IC(36, N)], str[IC(37, N)], str[IC(38, N)], str[IC(39, N)],  \
    str[IC(40, N)], str[IC(41, N)], str[IC(42, N)], str[IC(43, N)], str[IC(44, N)], str[IC(45, N)], str[IC(46, N)], str[IC(47, N)], str[IC(48, N)], str[IC(49, N)],  \
    str[IC(50, N)], str[IC(51, N)], str[IC(52, N)], str[IC(53, N)], str[IC(54, N)], str[IC(55, N)], str[IC(56, N)], str[IC(57, N)], str[IC(58, N)], str[IC(59, N)],  \
    str[IC(60, N)], str[IC(61, N)], str[IC(62, N)], str[IC(63, N)], str[IC(64, N)], str[IC(65, N)], str[IC(66, N)], str[IC(67, N)], str[IC(68, N)], str[IC(69, N)],  \
    str[IC(70, N)], str[IC(71, N)], str[IC(72, N)], str[IC(73, N)], str[IC(74, N)], str[IC(75, N)], str[IC(76, N)], str[IC(77, N)], str[IC(78, N)], str[IC(79, N)],  \
    str[IC(80, N)], str[IC(81, N)], str[IC(82, N)], str[IC(83, N)], str[IC(84, N)], str[IC(85, N)], str[IC(86, N)], str[IC(87, N)], str[IC(88, N)], str[IC(89, N)],  \
    str[IC(90, N)], str[IC(91, N)], str[IC(92, N)], str[IC(93, N)], str[IC(94, N)], str[IC(95, N)], str[IC(96, N)], str[IC(97, N)], str[IC(98, N)], str[IC(99, N)],  \
    str[IC(100, N)], str[IC(101, N)], str[IC(102, N)], str[IC(103, N)], str[IC(104, N)], str[IC(105, N)], str[IC(106, N)], str[IC(107, N)], str[IC(108, N)], str[IC(109, N)],  \
    str[IC(110, N)], str[IC(111, N)], str[IC(112, N)], str[IC(113, N)], str[IC(114, N)], str[IC(115, N)], str[IC(116, N)], str[IC(117, N)], str[IC(118, N)], str[IC(119, N)],  \
    str[IC(120, N)], str[IC(121, N)], str[IC(122, N)], str[IC(123, N)], str[IC(124, N)], str[IC(125, N)], str[IC(126, N)], str[IC(127, N)]

#define IC(index, count)  (index) >= (count) ? ((count) - 1) : (index)

#define CT_STR(str) decltype(make_ct_string<str_size(str), STR_TO_CHARS(str)>())


#include <iostream>

template<typename T>
void foo()
{
    std::cout << "size=" << T::size() << " string: " << T::to_string() << std::endl;
};


int main()
{   
    foo<CT_STR("Hello world!!!!")>();    
    return 0;
}


Тут ещё конечно можно более строго подойти: поскольку используется decltype наверняка можно было бы избавиться от имплементации функции вычислив возвращаемый тип в каком-нибудь std::conditional, да и уменьшить количество шалонов использовав например CharAt из статьи, но в качестве отправной точки думаю сгодиться :)

ссылка coliru
Забыли ещё упомянуть, что для explicit оператора приведения к bool не нужно делать явного преобразования при применении в if и while выражениях:

class Simple {
public:
    operator bool() const { return true; }
};

class SimpleExplicit {
public:
    explicit operator bool() const { return true; }
};

int main(int, char**) {
    
    Simple s;
    bool b = s; // OK
    
    SimpleExplicit se;
    // bool a = se; // COMPILE ERROR
    bool c = static_cast<bool>(se); // OK
    
    // BUT...
    if(se) // OK - no need explicit cast to bool
    {
    };

    return 0;
}
А почему электронная версия книги не опубликована на такой площадке, как GooglePlay ?
Я думал в этот раз не сработает «правило вечеринки». А оно вон как! Ну вот дважды уже было у MS — неужели Яндекс не знает, что устраивать вечеринку в день запуска — это ВСЕГДА плохая идея???
Вот и хотелось бы без всяких «если» узнать у человека :)
Насчёт шума в метро вопросов не возникает — наушники, которые даже такой равномерный шум подавить не могут шумоизолирующими не являются априори. Уточняю: интересует шумодав именно разговоров в офисе, чтобы даже в грёбаном опен-спейсе можно было по сути остаться надине с собой и работать в условиях полной (ну или почти полной) тишины.
Я так и непонял (может пропустил, пролистывая статью), а можно эти наушники использовать без музыки? Ну типа натянул их на уши, включил шумоподавление и тишина. Т.е. никакой музыки. И чтобы разговоры в офисе не слышать.
> Так безответственно я поступил потому, что более тщательные подходы к изложения именно своего личного опыта у меня закончились неудачей.

Я понял, в чём я промахнулся в своём изначальном вопросе выше (http://habrahabr.ru/post/229611/?reply_to=7774045#comment_7773139) :)
Мой подход, выработанный практикой (и годами) следующий: потребовалось один раз и проскочил — ладно, фиг с ним, второй раз — задумайся, оцени, может быть проработай немного вопрос, если кажется, что времени это потребует не так много (для того же английского оказалось довольно полезным походить пару месяцев на разговорные курсы, чтобы и какую-то разговорную практику выработать и по крайней мере чувствовать себя увереннее и проще излагать свои мысли, чтобы тебя понимали и вообще какой-то диалог складывался), потребовалось третий раз и предыдущий блиц в решении проблемы не дотянул, или тогда было решено отложить — решай проблему осовательней — но тут главное не переборщить и чётко формулировать проблему (задачу), которую решаешь — если требуется только общаться — не нужно пытаться делать из себя лингвиста, чтобы тратить кучу времени на то, что и так не вызывает жуткого фанатизма, а тут вообще бесить будет от того, сколько на это времени тратишь.

В то же время есть некоторые векторы развития, которыми вроде бы и хотелось бы заниматься, но которые не долбят своей необходимостью. Это некоторая проблема, которая долбят не снаружи, а изнутри… И тут автор статьи предлагает искать компромис между сознанием и подсознанием? Мой подход несколько иной: во-первых, не нужно сразу бросаться с головой, как только пришла идея — она должна какое-то время потомиться, чтобы и некоторым временем проверить, а не очередная ли это хотелка, навеяна трендом, модой и какими-то слухами, как где-то здорово, где нас нет, но если после этого периода ни идея, ни хотелка не пропадают, а мозг продолжает обсасывать, как бы это было здорово — то нужно просто нАчать! И вот тут без какого-то усилия над собой (называйте, как хотите) это самое НАЧАТЬ может не случиться, потому что человек (ну или ладно, только я) — это ленивая задница, в котором подсознание навязывает чувство комфорта — и тут же всплывает куча причин, почему стоит отложить ещё на чуть чуть (работа, устал, тут и так много платят, выше головы не прыгнешь и пр.). Самое интересное, что то ли с годами, то ли я таким родился, но выработалось чувство, когда приходит момент этого нАчать — и вот тут главное не пойти на попятную, потому что — опять же из моей практики — если пережить этот довольно короткий период дискомфорта, то потом наступает (в сравнении) долгий и продуктивный период истинного счастья. А каждый раз, когда я шёл на поводу и своего подсознания (да лени — что уж там) — я потом себя ещё больше ненавидел и только потеряв время и нервы всё равно приступал к тому, чего нужно было уже давно начать.
> У меня создается ощущение, что Вы думаете, что полностью разобрались в себе, и это не помогло. Тогда как на самом деле Вы скорее всего просто не до конца разобрались.

ок… вы наверное считаете, что смогли разложить меня по кирпичикам?

В общем вы не правы хотя бы потому, что я такой весь запутавшийся сейчас счастлив так, как не был счастлив никогда, за последние пару-тройку лет открыл в себе некоторые качества и/или смог поменять неожиданно для себя многое, как в моей жизни, так и в мировозрении, перспективы и приоритеты в моей жизни не были никогда настолько чёткими и ясными… Да и тот же английский уже как-то для меня не проблема — я нашёл для себя решение… Тут же просто привёл пример, который будет понятен всем (в том числе и мне), чтобы более детатьно обсудить весь тот теоретический посыл, что был описан в статье.

Я-то хотел другое узнать… Наверное не сомог донести свой вопрос — все вдруг яро на этот английский напали… Нужно было явно меньше конкретики :(
Я понял, что вы не видели мой комментарий, где я говорил, что уже не парюсь и просто решил спросить на примере английского, потому что эта проблема в моей жизни прошла некоторую эволюцию, и я мог бы на основе неё как-то подискутировать и далее возможно понять что-то новое. Вот:

habrahabr.ru/post/229611/?reply_to=7773607#comment_7773389

Как я понял, ничего нового мне уже не скажут.
Да я и не заморачиваюсь: в принципе я понял, что мой метод разрешения подобных ситуаций — дойти до крайности когда пан или пропал — и вот тут у меня активизируется вся мощь и силы… пока это работало и даже довольно эффективно, но я не могу не думать (хотя бы в фоне или после прочтения подобных статей) о том, что мой вариант не самый эффективный, вот и спрашиваю, приводя «проблему», которая уже прошла несколько стадий — может что-то новое узнаю и пойму :-)
Английский язык был проведён в качестве примера. Мне же хочется понять, как описаное в статье работает на эту и прохожие ситуации. Или это применимо только для глобальных целей и направлений жизни, а для отдельных раздражающих факторов всё таки придётся применять несуществующую силу воли?
Всё конечно ок… Бросить курить и сменить работу — это конечно здорово… Но как быть с вещами, которые требуются редко, но метко, и даже есть ненулевая вероятность, что когда-то эта вещь сыграет решающую роль?

Яркий пример — английский. Я его как-то знаю, достаточно, чтобы читать техническую литературу, технические статьи и смотреть технические семинары и лекции (особенно с субтитрами). Но вот нормальное, нетехническое общение — это проблема — связать свои знания в осмысленные предложения довольно сложно (хотя не сказать, чтобы я не справлялся с этим вообще). Но технический английский был изучен, просто потому что у меня не было выбора, просто потому что я люблю то, чем занимаюсь (программирование), а значит мне этого хочется больше и больше, а чтобы это больше получать не с опозданием пара лет, пока кто-нибудь что-нибудь переведёт на Хабру — приходилось идти через себя… Необходимость человеческого общения возникает крайне редко, а когда возникает — проклинаешь всё на чём свет стоял, потому что учиться уже времени нет — беда не приходит одна — а когда всё успокоится — нет мотивации углублённо заняться этим вопросом, потому что уже «проскочил»… А что касается дальних перспектив: где язык станет решающим фактором в том, чтобы не получить какой-нибудь большой плюшки — собеседование в международной компании, на вакансию которой я полхожу по всем параметрам, но общение там на английском, собеседование человеческое, многоступенчатое (т.е. не только техническое, но и с менеджерами и с HR пообщаться придётся) и тоже на англиском. Вот вроде я сам молодец и подхожу и техническое собеседование прошёл на ура, но с отстальным как бэ… В общем я думаю понятно… Конечно, если я очень очень захочу я через проклятия и ненависть к себе соберусь и выучу, научусь, найму преподавателя с палкой, который со мной будет говорить только на англиском по 24 часа с сутки, но опять же, как то это получается так, не жизнь а какая-никакая каторга, и постоянный анализ не помогают, потому что уже всё осознал, но человеческая тушка и мозг обладают такой инерцией, что сдвинуть в давно укрепившемся подходе (и так сойдёт) не очень-то получается.

Вот как такие небольшие цели можно подтянуть под ашу идеологию?

P.S. Сразу скажу, что есть несколько вещей, которые мне-таки удалось сделать может не с первого раза, но всё же, после чего приходило счастье. Но до этого счастья приходилось переступать через себя и руководствоваться именно какой-то определённой силой воли. Я не мазохист и не буду себя глобально заставлять то, чего не хочу (торчать на ненавистной работе например), но даже самое интересное, то что занимает большую часть твоей жизни и в чём с мотивацией и развитием проблем нет, сопровождается некоторыми деятельностяти, которые делать не очень хочется. Что тут поможет, как не «мифическая» сила воли? Убеждения? Анализ? Всё уже давно переанализировано и понято, что нужно. По-настоящему! Время не пришло? А может быть я просто ленивая скотина?
Спасибо! Теперь этот аспект и противоречия (которых на самом деле нет — я понял где мой фэйл) разложены в моей голове по полочкам.
> Согласно (несколько необычным) правилам С++, при выборе функции-члена для временного объекта, не-const версия предпочтительней const версии

А под этим есть хоть какая-то логика? Просто это выгляди очень странно, когда мы передаём временную переменную в функцию по ссылке, ссылка обязательно должна быть const, иначе кидается ошибка компиляции:

coliru.stacked-crooked.com/a/6cfbe273f9871aaa
> Размышления на тему того, как обратная совместимость мешает C++ достичь звёзд…

А ведь автор в чём-то прав. Вот например такие абсолютно неочевидные хрени буквально рвут мозг (особенно когда первый раз с этим сталкиваешься):

habrahabr.ru/post/68796/

А для чего это? Правильно, для обратной совместимости со старыми C программами (привет из 80-х).
я правильно понимаю, что GC в нём по-умолчанию включён?

P.S. Никто кстати не желает забабахать подобное сравнение про D?
1
23 ...

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность