• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed sprawdzanie typów podczas kompilacji

Object Storage Arubacloud
0 głosów
144 wizyt
pytanie zadane 29 listopada 2020 w C i C++ przez TOWaD Mądrala (5,700 p.)
zamknięte 1 grudnia 2020 przez TOWaD

Na tym forum przeczytałem o usuwaniu elementu z tablicy przez wskaźnik niby banalne, ale .... wcale nie.

#include "liststl.h"
namespace liststlnamespace { // pytanie 1 ? 
namespace constexprData { // to zostaje
constexpr size_t arlen=10;
}
double changetype; // zamiast templatki :)
using arrayData=std::array<decltype(changetype),constexprData::arlen>;
arrayData ar{1,2,3,4.4,5,6,7,8,9,10};
std::list<arrayData::iterator>li;
std::list<arrayData::iterator> garbagecollector ;

}

1) czy z tego opłaca się zrobić templatkę i czy da zrobić krótką np. 10 linii by użyć w klasie "liststl" najepej w tym samym pliku, i bez specjalnych zabiegów by wstawiać różne typy do klasy do sprawdzania

 A jak nie to

template <typename T>
void liststl::removeElement(T t) {
    auto itli = liststlnamespace::li.begin();

//  typedef std::common_type<decltype(*itli),int>::type NumericType;
//    typedef std::common_type<decltype(*itli, double>::type FloatType;

    // std::cout<<typeid(*itli).name()<<std::endl;
   if(liststlnamespace::li.size()<=liststlnamespace::constexprData::arlen) 
        for(auto &x:liststlnamespace::li) {
    //pytanie 2     if (is_same<decltype(*itli),decltype(t)>::value
            if(*x==t ) {
                *x=0;
                liststlnamespace::garbagecollector.push_back(std::move(x));
                    liststlnamespace::li.erase(itli);
                    std::cout<< "\niteratory sa trudne\n";
                    break;
                }
            itli++;
        }
};

2) Co tu zrobić by nie porównywać jak będą niezgodne typy?

Ta klasa jest po nic  tak sobie przerabiam 

<type_traits> | Microsoft Docs

komentarz zamknięcia: zadając głupie pytanie, nie można oczekiwać mądrej odpowiedzi :)
komentarz 29 listopada 2020 przez tangarr Mędrzec (154,860 p.)
Kilka razy czytałem to pytanie i wciąż go nie rozumiem. Spróbuj je lepiej sformułować.
komentarz 30 listopada 2020 przez TOWaD Mądrala (5,700 p.)
edycja 30 listopada 2020 przez TOWaD
Generalnie to kod działa do int double string, ale muszę zmienić typ "double changetype;" na np. "string changetype". A lepiej jak by działało jak klasa typu Template.

Jak przerzucam templatkię  do "liststl.h" to mam podwójne dołączenie, żeby było ok to musze, całość przerzucić do liststl.h, dla mnie to za dużo linii kodu w jednym pliku (chyba po to są klasy i wskaźniki na nie). Funkcje template działają, na rozdzielenie na 2 pliki bez problemu.

Z zmierzeniem waunku "if (is_same<decltype(*itli),decltype(t)>::value" żeby nic nie robiła funkcja ja typy są nie zgodne.(double changetype != T t)
komentarz 30 listopada 2020 przez tkz Nałogowiec (42,000 p.)
https://en.cppreference.com/w/cpp/types/is_same
Kompletnie nie wiem o czym piszesz.
komentarz 30 listopada 2020 przez tangarr Mędrzec (154,860 p.)
A co masz w pliku liststl.h?
komentarz 30 listopada 2020 przez j23 Mędrzec (194,920 p.)
void liststl::removeElement(T t)
{
    if constexpr (!std::is_same_v<typename decltype(li)::value_type, T>) return;
    ...

O to chodzi?

komentarz 1 grudnia 2020 przez TOWaD Mądrala (5,700 p.)
removeElement("aa"); błędny typ
 removeElement(7);
   if (!(std::is_same<decltype(itli)::value_type,T>::value)) return;
                if(*x==t ) //błąd kompilatora invalid operands of types 'double' and 'const char*' to binary 'operator=='|

Ale w sumie już nieważne, ważne że działa dla prawidłowych danych jak się celowo nie psuje

komentarz 1 grudnia 2020 przez j23 Mędrzec (194,920 p.)

Nie zauważyłem, że lista trzyma iteratory. Zatem tak:

template <typename T>
void removeElement(T t)
{
    using list_val_type = typename decltype(liststlnamespace::li)::value_type;

    if constexpr (std::is_same_v<typename std::iterator_traits<list_val_type>::value_type, T>) {
        auto itli = liststlnamespace::li.begin();
        if (liststlnamespace::li.size() <= liststlnamespace::constexprData::arlen)
            for (auto& x : liststlnamespace::li) {
                if (*x == t) {
                    *x = 0;
                    liststlnamespace::garbagecollector.push_back(std::move(x));
                    liststlnamespace::li.erase(itli);
                    std::cout << "\niteratory sa trudne\n";
                    break;
                }
                itli++;
            }
    }
}

 

komentarz 1 grudnia 2020 przez TOWaD Mądrala (5,700 p.)
coś się sypie, ale a tak jak pisałem wcześniej , źle zbudowany program i już.
komentarz 1 grudnia 2020 przez j23 Mędrzec (194,920 p.)
Kod odpowiedzialny za testowanie typów jest na bank poprawny. W resztę kodu nie wnikałem.
komentarz 2 grudnia 2020 przez TOWaD Mądrala (5,700 p.)
tu chodzi o templatkę w pliku.cpp jak tak się nie robi to się nie robi i tyle, a Cały kod dała tak jak powinien czyli jak pozmieniam dla stringa to wskazuje na stringi, a jak na inną klasę to tez ok.

Podobne pytania

0 głosów
1 odpowiedź 252 wizyt
pytanie zadane 8 stycznia 2018 w C i C++ przez aabbcc Nowicjusz (150 p.)
+2 głosów
1 odpowiedź 1,999 wizyt
pytanie zadane 19 kwietnia 2015 w C i C++ przez Radfler VIP (101,030 p.)
0 głosów
1 odpowiedź 199 wizyt

92,572 zapytań

141,422 odpowiedzi

319,644 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...