Кресты / Говнокод #18440 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
XmlWriter<xhtml11::XHtmlDocument>(stream)
<html
  <head
    <title
      <"Hello world!"
    >title
  >head
  <body
    <p
      <"Some nice paragraph text."
    >p
    <img(src="http://example.com/hello.jpg",alt="Hello")>img
  >body
>html;

кресты в квадрате. любителям темплейтов посвящается.

http://www.vandenoever.info/blog/2015/07/05/literal-xml-in-c++.html

Creating and processing XML feels awkward in most programming languages. With Blasien, a tiny C++11 header library, XML in C++ feels easy and natural. As an extra the XML that is written is mostly validated at compile time.

Запостил: Dummy00001 Dummy00001, (Updated )

Комментарии (56) RSS

      • ... я думаю что Her ссылается тот факт что после C++14, кресты на кресты больше не похожи.

        меня уже даже не удивит если кто на темплейтах/операторах/этц интерпретатор перла напишет...
        Ответить
        • В смысле "кресты на кресты не похожи".
          Смотрю на стандарт ++14 и жду не дождусь 2014 года... ОЧЁРТ
          Ответить
  • Есть два вида шаблонизаторов: xslt и шаблонизаторы доля хуесоса. Этот относится ко второму виду.
    Ответить
  • А вообще вполне себе симпатично. До тех пор, пока дебажить не пришлось...
    Ответить
    • Уметь надо (это перегруженные операторы и глобалки alt и src, видимо).
      Ответить
      • > глобалки alt и src
        Интересно, а можно ли как-то извернуться и вогнать туда произвольные атрибуты, используя наиболее короткую запись.
        Приближения, которые приходят в голову:
        1. Конструктор от строки: запись $("src")="...", $("alt")="...." - 5 лишних символов на параметр
        2. Шаблонная использовать строки как отдельный параметр: "src", "...", "alt", "..." - 2 лишних символов на параметр + нельзя "="
        3. Макрос, который делает # своим нечётным аргументам: запись src, "...", alt, "..." - нельзя "="
        Ответить
        • 4. Какая-нибудь питушня с пользовательскими литералами - как №1, но скобки не нужны
          Ответить
            • А всё нормально будет: у функции img ноль параметров, а все значения она берёт из глобальных переменных. Так что и такую возможность Борманд предусмотрел.
              Ответить
              • >>у функции img ноль параметров, а все значения она берёт из глобальных переменных.
                капитан в треде
                Ответить
          • А как оно работает?
            Оператор запятая возвращает правый аргумент. Оператор присваивания возвращает const char* (goatse). Но функция ничего не принимает!
            Ответить
            • Это не «оператор запятая», а разделитель аргументов функции.

              Рассказать в деталях, как оно работает, или оставить в качестве домашнего задания?

              Подсказка: при соглашении cdecl стек чистится вызывающим кодом.
              Ответить
              • Не знал что можно предавать в функцию больше аргументов, чем она принимает. Лучше разъясни, похоже я опять не так понял.
                Ответить
                • в С, обявление `int f();` идентично `int f(...);`. функция `int f(void)` - не принимает аргументов, а без этого войда у функции нет ограничения на аргументы и их количество.
                  Ответить
                  • а я то думал пишут f(void) от нехуй делать
                    теперь понятно
                    Ответить
                    • Давно-давно,когда мы все еще не родились, а у некоторых даже и папы с мамами еще не родились, в сях нельзя было указывать аргументы в декларейшене функции.

                      Всё было на совести программиста, компилятор ничего не проверял.

                      Просто писали foo() и всё.

                      Когда ввели возможность указывать аргументы, то ради обратной совместимости сделали так:

                      1) foo() -- НЕИЗВЕСТНО какое аргументы (комплиятор может не проверять)
                      2) foo(void) --аргов точно нет.

                      Мне кажется это написано в книжечке Кернигана и Ричи. Такая тонкая книжка по основам сей, достаточно годная.
                      Ответить
                      • А старый код ещё будет компилироваться как надо? Не напорется ли на какие-нибудь новые правила в другом месте (скажем, UB какое-нибудь), из-за чего его проще будет переписать, а такая совместимость - не более, чем троллинг?
                        Ответить
                        • будет компилироваться, но будут ворнинги в большинстве известных мне компиляторов

                          собственно, ворнинги были еще в борланд си 1993го года:) (правда там был ключик "ANSI C" или "K&C", и вот в ANSI C были варнинги)

                          Ну вот вижалси до сих пор компилирует, но пишет ворнинги
                          https://msdn.microsoft.com/en-us/library/efx873ys.aspx

                          зы: может быть и напорица на что-то, я никогда не поддерживал код, написанный до 1989го года (или когда там вышли анси си)
                          Ответить
                      • Как можно получить внутри функции её аргумент?
                        void foo() {
                          printf("%d\n", ???);
                        }
                        foo(5);
                        Ответить
                        • Вероятно нужно знать call convention. Обычно аргумент будет или в стеке, или в регистре.
                          Обладая этим знанием можно его получить.

                          Еще есть va_arg, но я не знаю будет-ли он тут работать.

                          Но Борманд не получал аргументов, он юзал глобальные переменные
                          Ответить
                          • Пиздец. Нахуй тогда си нужен? Писали бы себе дальше на асме.
                            Ответить
                            • Что тебя так разозлило?
                              Ты хочешь сделать функцию с переменным числом аргументов?
                              Ну так юзай va_arg, только делай это явно, и будет тебе щастье.

                              Си нужен чтобы переносить низкоуровневый шлак между платформами (особенно между процессорами), ну и писать на нём всё таки проще, чем на асме.
                              Ответить
                              • Ты писал что раньше нельзя было указывать аргумент ты в декларейшине вункции. И я задался довольно helloworldным вопросом как передать в функцию 1 аргумент, а затем его прочитать. И не получил однозначного ответа.
                                Ответить
                                • Извини, я тебя не сразу понял.

                                  В дефинишене можно было указывать параметры, в декларейшене было не обязательно.

                                  причем в дефинишене они писались немного не так.

                                  // Pitushok.h:
                                  void kokoko()
                                  
                                  // Pitushok.c:
                                  void kokoko()
                                  int kurochka;
                                  {
                                  printf("koko %d", kurochka);
                                  }
                                  
                                  // haxor.c
                                  #include "Pitushok.h"
                                  
                                  void main() {
                                  kokoko(42);
                                  }


                                  Так что обращаться можно было очень просто. Просто комплятор не проверял что ты туда передаешь. Ты мог сказать kokoko("foo") и получить туда адрес
                                  Ответить
                                  • Описание типов аргументов в синтаксисе K&R отдельной строкой перед блоком операторов {} случайно не из Фортрана просочилось?
                                    Ответить
                                    • не в курсе про фортран. в С это был дизайн десижн, потому что в те времена "визуальных текстовых редакторов" еще не было - как и не было нормальных дисплеев - и сырцы редактировались построчно. поэтому и каждый аргумент на своей строчке. не удивлюсь если у фортрана была та же мотивация.
                                      Ответить
                • в строке "void img()" нет указания на количество аргументов

                  функция без аргументов это void img(void)

                  а раз не указано, то пофиг скока передавать
                  Ответить
  • Чото я думаю что C++ не лучший ЯП для создания DSLей
    Чай не груви, не руби, и не котлин
    Ответить

Добавить комментарий

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8