Problem mit Traits



  • Tatsächlich kompiliert es jetzt! 🙂 VIELEN VIELEN DANK!
    Und wie würde ich die Methode get_channel() jetzt aufrufen (Also für einen Gray)? Irgendwie verwirrt mich das alles noch. Kennt jemand vielleicht ein gutes Tutorial?

    Mit freundlichen Grüßen



  • Kennt jemand vielleicht ein gutes Tutorial?

    http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

    Kapitel 14 - Templates. 🤡

    Spaß beiseite - hol dir ein gutes Grundlagenbuch.

    Und wie würde ich die Methode get_channel() jetzt aufrufen (Also für einen Gray)?

    Mit den entsprechenden Argumenten?



  • http://www.open-std.org/j ....... ocs/papers/2012/n3337.pdf

    GEHT LOS! 😃

    #include "color.hpp"                                                                                                                
    #include <iostream>
    int main(){
        gray<int> *a = new gray<int>();
        a->intensity = 10; 
        std::cout<<channel<int>::get_channel(*a,2)<<std::endl;
        delete a;
        return 0;
    }
    

    Das geht nicht! 🙂 Aber wie geht es dann? 🙂



  • Welchen Code hast du denn jetzt genommen? Den von orjod?



  • HAHA LOL! Sry, ja, das war ich. Hab mich beim Benutzernamen verschrieben! SORRYYY!!! Und ja, ich hab den Code genommen



  • Halt stop, jetzt hab ich mich doch glatt verguggt! Also das hab ich nicht geschrieben. Aber ich habe den Code von ojrod genommen! Ich glaub ich sollte mal einen Kaffee trinken gehen um ein wenig runter zu kommen!



  • Also ich habe es jetzt mit viel Hilfe und noch leichtem Unverständniss gelöst bekommen.
    Falls es jemanden interessiert:

    template <template<typename> class COLOR>
    struct is_gray{
        template<typename TYPE>
        static TYPE getValue(const COLOR<TYPE>& color, int i)
        {
    	return color.data[i];
        }
    };
    
    template <>
    struct is_gray<gray>{
        template<typename TYPE>
        static TYPE getValue(const gray<TYPE>& color, int i)
        {
    	return color.intensity;
        }	
    };
    
    template <template<typename> class COLOR, typename TYPE>
    TYPE get_channel(const COLOR<TYPE>& color, int i){
        return is_gray<COLOR>::getValue(color, i);
    }
    

    Das nutzt jetzt, wenn mich nicht alles täuscht auch Traits-Klassen!

    Mit freundlichen Grüßen
    DorJo



  • Ein paar Anmerkungen:

    struct rgb{ 
        T data[3]; 
        static const int num_channels = 3;
        ...
    
    struct gray{
        ...
    

    Warum hat rgb ein Member num_channels und gray nicht, wobei du nachtraeglich zwei Funktionen definierst, die genau diesen Umstand korrigieren. Einfach num_channels auch in gray definieren und 2 Funktionen/Strukturen gespart. Was spricht gegen constexp ?

    int main(){ 
        gray<int> *a = new gray<int>(); 
        a->intensity = 10;
         std::cout<<channel<int>::get_channel(*a,2)<<std::endl; 
        delete a;
    

    new und delete in diesem Fall sind einfach verpoent. gray<int> einfach instantiieren ohne Heap ... schon wieder Zeilen gespart.

    Beim Namen is_gray erwarte ich eine Funktion/Struktur, die mir angibt, ob die Farbe grau ist, d.h. irgendwie mit bool verknueft ist.



  • wir dürfen an den structs nichts ändern, deswegen können wir in gray nicht einfach num_Channels hinzufügen...


  • Mod

    Sone schrieb:

    Der erste Template-Parameter von calc ist ein ein vollständiger Typ.

    Das ist bloss ein Typ. Vollständig (complete) muss der - jedenfalls im gezeigten Code - nicht sein.

    Wieso nicht einfach ein normales Funktionstemplate verwendet wird (statt Memberfunktion/-template), erschliesst sich mir nicht. So ist nur unnötig Redundanz drin.


Anmelden zum Antworten