Spezialisierung eins template operators in den globalen namespace importieren



  • Hallo!

    Ich habe eine template Funktion und einen template Operator in einem namespace:

    namespace detail
    {
      template <typename T>
      T func(T t)
      {
        return t;
      }
    
      template <typename T>
      T operator~(T t)
      {
        return t;
      }
    }
    

    Beides möchte ich spezialisiert für ein scoped Enum in den globalen namespace importieren:

    enum class type
    {
    };
    
    type (&func)(type t) = detail::func<type>;
    type (&operator~)(type t) = detail::operator~<type>;
    

    Bei der Funktion funktioniert das auch wunderbar, jedoch bekomme ich bei dem Operator folgende Fehlermeldung:

    % g++ -std=c++11 test.cpp && ./a.out
    test.cpp:21:25: error: declaration of ‘operator~’ as non-function
     type (&operator~)(type t) = detail::operator~<type>;
    

    Offenbar geht das so nicht. Mache ich etwas falsch oder gibt es vielleicht noch eine andere Möglichkeit?

    Vielen Dank im Voraus!


  • Mod

    Offenbar geht das so nicht.

    Nein, leider nicht. Du musst den Operator für type überladen:

    type operator~(type t)
      {
        return detail::operator~(t);
      }
    

  • Mod

    Importeur schrieb:

    Beides möchte ich spezialisiert für ein scoped Enum in den globalen namespace importieren:

    enum class type
    {
    };
    
    type (&func)(type t) = detail::func<type>;
    type (&operator~)(type t) = detail::operator~<type>;
    

    Interessante Idee. Allerdings würde func nicht per ADL gefunden werden können, was ggf. später für Überraschungen sorgt. Und operator-ids können nur für Funktionen verwendet werden, nicht Variablen.

    Unproblematisch wäre es, einfach Funktionen zu schreiben, die deligieren.

    auto func(type t) { return detail::func(t); }
    auto operator~(type t) { return detail::operator~(t); }
    

    evtl. kommen auch using-Deklarationen in Betracht, die sind dann aber nicht auf eine einzelne Spezialisierung beschränkt.


  • Mod

    kommen auch using-Deklarationen in Betracht.

    Nein, using -Deklarationen können nur unqualified-ids in Namensräumen nennen, nicht Spezialisierungen von Templates.

    Explizite Instantiierungen gehen leider auch nicht da diese im selben Namensraum stehen müssen.


Anmelden zum Antworten