Ist es möglich, Vorlage zu emulieren?

Lesezeit: 3 Minuten

Ist es moglich Vorlage zu emulieren
Xeo

Ist es irgendwie möglich? Ich möchte, dass die Übergabe von Argumenten zur Kompilierzeit ermöglicht wird. Angenommen, es dient nur der Benutzerfreundlichkeit, da man immer den echten Typ eingeben könnte template<class T, T X>aber für einige Typen, zB Pointer-to-Member-Funktionen, ist es sogar mit ziemlich mühsam decltype als Abkürzung. Betrachten Sie den folgenden Code:

struct Foo{
  template<class T, T X>
  void bar(){
    // do something with X, compile-time passed
  }
};

struct Baz{
  void bang(){
  }
};

int main(){
  Foo f;
  f.bar<int,5>();
  f.bar<decltype(&Baz::bang),&Baz::bang>();
}

Wäre es irgendwie möglich, es wie folgt umzuwandeln?

struct Foo{
  template<auto X>
  void bar(){
    // do something with X, compile-time passed
  }
};

struct Baz{
  void bang(){
  }
};

int main(){
  Foo f;
  f.bar<5>();
  f.bar<&Baz::bang>();
}

  • @GMan: Aktualisiert, hoffe es macht jetzt mehr Sinn. 🙂

    – Xeo

    11. April 2011 um 22:27 Uhr

1646320814 256 Ist es moglich Vorlage zu emulieren
GManNickG

Nach deinem Update: nein. Eine solche Funktionalität gibt es in C++ nicht. Am nächsten sind Makros:

#define AUTO_ARG(x) decltype(x), x

f.bar<AUTO_ARG(5)>();
f.bar<AUTO_ARG(&Baz::bang)>();

Klingt so, als wollten Sie einen Generator:

template <typename T>
struct foo
{
    foo(const T&) {} // do whatever
};

template <typename T>
foo<T> make_foo(const T& x)
{
    return foo<T>(x);
}

Anstatt jetzt zu buchstabieren:

foo<int>(5);

Du kannst tun:

make_foo(5);

Um das Argument abzuleiten.

  • Dies ist sogar noch nützlicher in C++0x, wo Sie verwenden können auto my_foo(make_foo(5)); ohne jemals den Typ benennen zu müssen foo<int> vollständig.

    – James McNellis

    11. April 2011 um 22:22 Uhr

  • Wenn das Übergeben des Arguments an eine Funktion ein Problem gewesen wäre, hätte Asker direkt verwenden können f.bar(5); und deklarieren Sie die Methode einfach als template<typename T>void bar(T &X);. Was nützt dir dein make_foo() ?

    – iammilind

    12. April 2011 um 3:30 Uhr

  • @iammilind: Es war eine alte Vermutung zu seiner Frage, bevor er klarstellte.

    – GManNickG

    12. April 2011 um 3:58 Uhr

  • @iamm: Die Ableitung von Vorlagenargumenten funktioniert nur mit Funktionen, nicht mit Klassen.

    – Dennis Zickefoose

    12. April 2011 um 4:02 Uhr

  • @Jonathan.: Ich glaube nicht, dass viele Dinge in der Sprache standardmäßig funktionieren, geschweige denn auto als Erweiterung auf zwei separate Vorlagenparameter.

    – GManNickG

    19. Mai 2016 um 15:54 Uhr

Es wurde in C++17 hinzugefügt. Jetzt können Sie schreiben

template<auto n> struct B { /* ... */ };
B<5> b1;   // OK: non-type template parameter type is int
B<'a'> b2; // OK: non-type template parameter type is char

Sehen http://en.cppreference.com/w/cpp/language/template_parametersPunkt 4 des Vorlagenparameter ohne Typ Sektion

Es ist nicht möglich. Der einzige Weg, dies zu erreichen, ist Argument in die Funktion übergeben:

struct Foo{
  template<class T> void bar(T& X) {}
};

Und rufen Sie dann die Funktion auf als,

f.bar(5);
f.bar(&Baz::bang);

924720cookie-checkIst es möglich, Vorlage zu emulieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy