nichtspezifierte, benannte template-Parameter



  • Gibts sowas? Ich meine so in der Art

    template<class T i>
    


  • Was für einen Zweck soll i erfüllen?



  • Ich hatte mir sowas gedacht:

    template<bool flag,class T a,class T b>
    struct select
    {
    	enum{result=a};
    };
    
    template<class T a,class T b>
    struct select<false,a,b>
    {
    	enum{result=b};
    };
    

    /edit: in loki gibts ja:

    template<bool flag,class T,class U>
    struct select
    {
    	typedef T result;
    };
    
    template<class T,class U>
    struct select<false,a,b>
    {
    	typedef U result;
    };
    

    (Jetzt nur mal so aus dem Kopf...



  • Kapier ich nicht. Was soll i machen?



  • Wie gesagt, das mit i war nur ein Beispiel wie ich mir die Parameter vorstellen würde. So kann ich das nicht kompilieren. Und was ich genau bezwecken will, siehst du am 2. Ich könnte (und mach ich zur Zeit auch noch)

    template<bool flag,int a,int b>
    

    schreiben.



  • Also falls ich dich richtig verstehe suchst du ein select für Konstante ?

    Nehm ich halt mal an, wenn du nicht Typen als Ergebniss
    liefern willst, sondern eben Konstante.

    Vielleicht hilft dir das hier:

    template<bool B, typename T, typename U>
    class select {
    public:
    	typedef T result_type;
    
    	template<T i, U j>
    	class result {
    	public:
    		static const T value = i;
    	};
    };
    
    template<typename T, typename U>
    class select<false, T, U> {
    public:
    	typedef U result_type;
    
    	template<T i, U j>
    	class result {
    	public:
    		static const U value = j;
    	};
    };
    
    void f()
    {
    	typedef select<true, int, long> Selector;
    
    	cout << Selector::result<5, 6>::value << endl   // == 5
             << Selector::result<6, 7>::value << endl;  // == 6
    }
    

    Klappt allerdings nur mit Typen, die als Template Konstanten
    angegeben werden können, und die sind doch sehr beschränkt.



  • OK, so ungefähr. Aber ich hab mal noch ne Frage:
    Ich habe ein template deklariert, sieht so aus:

    template<class T,T t>
    class foo
    

    Das will ich in nem anderem template als standardparameter benutzen, so:

    template<template<class,class>class Foo=foo<char,'*'> >
    class bar
    

    Das quittiert mir der compiler mit:

    Syntaxfehler: Bezeichner 'foo<char,42>'
    'bar': Ungültige oder fehlende Vorlagenparameterliste
    Siehe Deklaration von 'bar'
    


  • template<template<class,class>class Foo=foo<char,'*'> >
    class bar
    

    foo<char, ''> ist kein Template-Template Parameter. foo<char, ''>
    hat ja bereits die vollständige Liste an Parametern.

    // entweder:
    template<template<class, class> class T = foo> >
    
    // oder:
    template<class T = foo<char, '*'>
    

    Das nächste Problem, wär dann noch die falsche Angabe von den Parametern.
    Du erwartest als Parameter ja einen Typ und eine Konstante dieses Typs, und
    nicht zwei Typen.

    Der Compiler schmeißt mir dazu folgenden Fehler raus:

    expected a template of type template<class, class> class Foo', gottemplate<class T, T t> class foo'

    template<typename T, T t>
    class Foo {	};
    
    template<template<typename T, T> class FooT = Foo>
    // oder eben: template<class FooT = Foo<char, '*'> >
    class Bar {     };
    

Anmelden zum Antworten