Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Biblioteki łatające dziury standardu C++

Ostatnio zmodyfikowano 2018-04-09 00:32
Autor Wiadomość
jankowalski25
» 2018-04-08 22:16:15
Zakładam, że to do mnie.
Ja z kolei zakładam, że do mnie, a konkretniej do fragmentu:
Nie ma problemu, wystarczy sprawić, by całość trwała równie długo dla każdego przypadku (ale chyba nie o to chodziło). Wszystko da się zrobić ze złożonością O(1), ale nie zawsze jest to dobrym pomysłem i lepiej wybrać inną złożoność, jeśli stałe będą mniejsze (lub przechowywać dane w innej formie, na przykład zmieniając kodowanie znaków).
Jeśli chodzi o ten kawałek, to celowo tak napisałem, ale przecież w praktyce nikt tak nie robi! Nie ma sensu wymuszać złożoności O(1) z jakąś gigantyczną stałą (bo do tego się sprowadza mój pomysł). Złożoność O(n) może być w praktyce lepsza od O(1), jeśli stałe będą odpowiednio dobrane. A co do zmiany kodowania, to raczej miałem na myśli robienie tego statycznie, a nie dynamicznie (jeśli w ogóle zajdzie taka potrzeba). Ten przykład miał pokazać tyle, że lepiej nigdzie nie pisać, że czegoś nie da się zrobić ze złożonością O(1), bo z tego co mi wiadomo, to każdy algorytm można sprowadzić do takiej postaci, tylko to będzie strasznie niepraktyczne. Takie tam czepianie się w moim stylu testera, który chce zrobić coś inaczej niż przeciętny człowiek i szuka dziury w całym, którą można byłoby załatać...

W tym przypadku zamiast napisać po prostu:
C/C++
SetWindowTextW( L"łąka" );
propozycją autora tego posta jest zrobienie:
C/C++
::SetWindowTextW( Utils::convert( MalaLiteraLzOgonkiemWUtf8 + MalaLiteraAzOgonkiemWUtf8 + "ka" ).c_str() )
Nie, jeśli już, to
SetWindowTextW( GET_TRANSLATED_STRING( meadow ) )
, gdzie
GET_TRANSLATED_STRING
 może być podstawiane w czasie kompilacji (napisałem to wielkimi literami sugerując makro, ale równie dobrze można byłoby spróbować użyć szablonów lub w jakiś inny sposób podstawiać tutaj właściwy tekst zanim nastąpi faza kompilacji wkładająca luzem surowe bajty do binarki). Ewentualnie można mieć jakiś plik z napisami w UTF-8, który przy kompilacji pod Windowsa zostanie przekonwertowany na UTF-16, a następnie zaciągnięte stamtąd napisy trafią bezpośrednio do exeka.

Wnioskuję, może błędnie, że akceptują one UTF-8, a UTF-16 już nie.
Akceptują
const char *
, a co się z tym dalej dzieje, to zależy już od implementacji, do której trzeba się po prostu dopasować (lub użyć czegoś innego jeśli standardowa implementacja nie spełnia oczekiwań).

Ten temat powinien się chyba nazywać
std::wstring and UTF-16 is [CENSORED]. Change my mind.
Dlaczego? Dyskusja o kodowaniach się rozwinęła, bo to jest jeden z problemów zamiatanych pod dywan, który później odbija się czkawką, ale skoro wspomniałeś też o innych zagadnieniach związanych z bibliotekami, to chyba nic nie stoi na przeszkodzie, aby zadać pytanie tego dotyczące i skierować rozmowę w biblioteki przeznaczone do innych celów niż obsługa Unikodu.
P-170567
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2018-04-08 22:41:48
Akceptują
const char *
, a co się z tym dalej dzieje, to zależy już od implementacji, do której trzeba się po prostu dopasować (lub użyć czegoś innego jeśli standardowa implementacja nie spełnia oczekiwań).
Masz rację, ale UTF-8 raczej muszą teraz wspierać, przecież specjalnie do tego jest w C++17
std::filesystem::u8path
. Mam przynajmniej nadzieję, że gdzieś jest to oficjalnie napisane.
P-170568
DejaVu
» 2018-04-08 22:47:34
Qt => QString => QChar => 16bit. Bang! Bang!

http://doc.qt.io/qt-5​/qchar.html

Proponuję podyskutować jeszcze o innych problemach jak np. GUI w C++. Niektórym nie odpowiada np. licencja typu LGPL co eliminuje używanie np. takiego Qt-a. Jakie alternatywy proponujecie do GUI?
P-170569
jankowalski25
» 2018-04-08 22:51:04
SFGUI? wxWidgets? WinAPI? To tak na początek, z tych co już padły w tym temacie.

Dopisano:
UTF-8 raczej muszą teraz wspierać
Chyba nie muszą. System plików może być dowolny, a implementacja może po prostu szukać takiego pliku, gdzie przekazane bajty zgadzają się z tymi, które są zapisane na dysku. Sam jestem ciekaw, jak przenośnie sprawdzić, jaki format jest tutaj oczekiwany. Ogólnie czasami mam takie wrażenie, że słowa "w razie wątpliwości zachowanie jest niezdefiniowane" należy sobie napisać na żółtej karteczce, przykleić do monitora i spoglądać na nią w razie jakichkolwiek wątpliwości podczas pisania w C++.

Niektórym nie odpowiada np. licencja typu LGPL
Zastanawiam się nad skutkami ubocznymi linkowania wszystkiego statycznie i dostarczenia narzędzia umożliwiającego podmianę niektórych kawałków na takie, jakich ktoś mógłby sobie życzyć. Chyba jednak to byłoby zbyt skomplikowane, chociaż teoretycznie pewnie możliwe... Nieważne, może lepiej wrócić na razie do bibliotek graficznych.
P-170570
Elaine
» 2018-04-08 23:11:36
Zastanawiam się nad skutkami ubocznymi linkowania wszystkiego statycznie
Linkowanie statyczne to relikt z uniksów z lat siedemdziesiątych, niech tam pozostanie. :P

Zastanawiam się nad skutkami ubocznymi linkowania wszystkiego statycznie i dostarczenia narzędzia umożliwiającego podmianę niektórych kawałków na takie, jakich ktoś mógłby sobie życzyć. Chyba jednak to byłoby zbyt skomplikowane, chociaż teoretycznie pewnie możliwe...
Takie narzędzie już wymyślono, nazywa się linker.
P-170572
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2018-04-08 23:16:29
Proponuję podyskutować jeszcze o innych problemach jak np. GUI w C++.
Ja nie mam nic przeciwko, rozwija się ciekawy temat.

Chyba nie muszą. System plików może być dowolny, a implementacja może po prostu szukać takiego pliku
Warto jednak też poczynić jakieś rozsądne założenia. W praktyce, pewnie nie wszystko obsługuje ASCII :P W ogóle mam wrażenie, że C++ tak bardzo chce być "do wszystkiego", że przez to zostaje w tyle.

A co do GUI:
Może z tego się coś rozwinie. Bazowane na wxWidgets:
Boost.UI
Jestem ciekaw, kiedy ktoś przygotuje jakąś szanującą się, wielką bibliotekę do GUI dla C++, o takich możliwościach jak np. WPF w C#. C++ ma cholernie duże możliwości, ale z tego co zauważyłem to rzadko powstają takie narzędzia "generalnego użytku". Wiecie, coś co może się przydać większości. Jak już to powstają jakieś molochy jak UE4, Qt, Unity itd.

Mój wishlist do biblioteki standardowej, który pewnie nigdy się nie spełni:
  • Pełne wsparcie dla Unicode
  • Refleksja (to w sumie i biblioteka standardowa i zmiany w core)
  • Obsługa sieci
  • Wrapper pod okienka
  • Wrapper OpenGL

A tak jeszcze offtopując, to marzy mi się, że kiedyś będę mógł np. napisać tak:
C/C++
template < typename CharType >
void Log::flush()
{
    if constexpr( $ System.Console.Available )
    {
        std::cout < CharType > << m_buffer;
    }
    else
    {
        // Zapis do pliku albo
        $ Compiler.Error( "Your OS does not provide console as standard output target." );
    }
}
Aww...
P-170573
jankowalski25
» 2018-04-08 23:24:50
Co do GUI, to może zacznę od najprostszego, czyli od samej konsoli. W wielu przypadkach narzędzia z
#include <iostream>
 całkiem nieźle się sprawdzają i są wystarczająco ogólne i przenośne, aby z nich korzystać. Kodowanie znaków zostało przed chwilą dość dokładnie opisane, więc to pominę (zwykle nie powinno być większych problemów z ustawieniem tego tak, aby wczytywać i zapisywać odpowiednie bajty, a to wystarczy do tego, by konsola wyświetliła to, co chcemy zobaczyć, byleby czcionka miała odpowiednie glify). Z tych przenośnych to ncurses, ewentualnie nieco mniej przenośne jest WinAPI (ale wineconsole sobie z tym poradzi), pod dystrybucjami Linuksa są odpowiednie terminale, w zależności od środowiska graficznego, w którym działają, a napisanie własnego graficznego terminala nie powinno stanowić większego problemu i można zrobić go tak samo, jak każdą inną aplikację okienkową.

nazywa się linker
Raczej chodziło o to, aby mając jeden, poskładany i zoptymalizowany plik binarny w wersji Release, użytkownik mógł dostarczyć własną implementację jakiejś biblioteki (jeśli jakaś licencja tego wymaga) i otrzymać jeden plik binarny, analogiczny do tego, gdyby sam skompilował wszystko statycznie od zera. Ale jak już wspomniałem, to jest dość wydumane i raczej nieopłacalne (chyba że znasz jakiś prosty sposób, aby to zrobić).

Refleksja (to w sumie i biblioteka standardowa i zmiany w core)
Dlaczego? Elaine podobno zaimplementował
dynamic_cast
 działające w czasie kompilacji (co jest lepszym pomysłem niż robienie tego samego w czasie wykonania, o ile założenia pozwalają na napisanie programu tak, aby dało się z tego skorzystać). A jakiś czas temu chyba podawał pod dywanem przykład, gdzie otrzymał refleksję w czasie kompilacji za pomocą boosta i preprocesora (jak znajdę, to wstawię link).

A co do tego kodu, który podajesz, to trochę mnie to dziwi. Nie lepiej użyć
std::cout << GET_TRANSLATED_STRING( cokolwiek );
 zgodnie z tym, co wcześniej napisałem?
P-170574
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2018-04-08 23:29:30
Nie lepiej użyć
std::cout << GET_TRANSLATED_STRING( cokolwiek );
 zgodnie z tym, co wcześniej napisałem?
Też można :) W każdym razie nie zawsze można w czasie kompilacji określić co będzie wypisywane. Tak tylko napisałem. Ciekawie by było, gdyby z
std::cout
 zrobili template variable.

A jakiś czas temu chyba podawał pod dywanem przykład, gdzie otrzymał refleksję w czasie kompilacji za pomocą boosta i preprocesora (jak znajdę, to wstawię link).
No właśnie jest to możliwe... tylko jakim nakładem pracy. Z refleksją można by było zrobić to samo ładniej, szybciej i przyjemniej. Mi się marzy też bardziej zaawansowana refleksja :P np. coś takiego:

namespace foo::bar::baz
{
    void hey()
    {
        $f = $this_function();
        for($ns : $namespace_iterator( f ))
        {
            std::cout << $ns.name() << "::";
        }
        std::cout << $f.name() << std::endl;
    }
}
// Wynik:
// "foo::bar::baz::hey"
Może to troche abstrakcyjne, ale jakie fajne! I wyobraźcie sobie jak takie ficzery ułatwiłyby np. logowanie błędów.
P-170575
1 2 3 « 4 » 5
Poprzednia strona Strona 4 z 5 Następna strona