Problem mit Traits



  • Sone hat's schon gesagt ... übersetzen würde z.B.:

    template <typename T>
    struct calc<gray<T> >{
        int num_channels(const gray<T>& color){
            return 1;
        }
    };
    


  • Ahh, danke! Das war wohl zu offensichtlich! 😞
    Ich habe allerdings noch eine Folgefrage.
    Warum sagt der Compiler dann zu folgendem Code:

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

    Fehler: für »template<class COLOR, class TYPE> struct channel« bereitgestellt
    Fehler: falsche Anzahl der Templateargumente (1, sollte 2 sein)

    Was mach ich denn falsch?

    Mit freundlichen Grüßen



  • DorJo schrieb:

    Was mach ich denn falsch?

    Du versuchst, channel<gray<TYPE> > zu spezialisieren, aber die Klasse gibt es gar nicht!

    Aber channel<gray<TYPE>,TYPE> gibt es:

    template <typename TYPE>
    struct channel<gray<TYPE>, TYPE>{
            TYPE get_channel(const gray<TYPE>& color, int i){ 
                    return color.intensity; 
            }   
    };
    

    Falls dich das doppelte TYPE in der Nutzung stört, bleibt dir nichts anderes übrig als eine Helferfunktion zu schreiben

    template <typename T> channel<gray<T>, T> make_channel(gray<T>)
    


  • 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