4 Stimmen

Schablonenhafte Barton- und Nackman-Trick-Probleme

Ich versuche, eine Klasse zu implementieren, die den Barton- und Nackman-Trick verwendet, um dynamisches Dispatch zu vermeiden. (Ich schreibe MCMC-Code, bei dem es auf die Leistung ankommt.) Ich bin kein C++-Experte, aber der grundlegende Trick funktioniert bei mir auch anderswo. Allerdings habe ich jetzt einen Fall, in dem die zweite abgeleitete Klasse als Vorlage verwendet werden muss. Das scheint Probleme zu verursachen. Die Grundzüge meines Codes sind:

// Generic step class
template<class DerivedStepType>
class Step {
public:
  DerivedStepType& as_derived() {
    return static_cast<DerivedStepType&>(*this);
  }

  void DoStep() {
    return as_derived.DoStep();
  }
};

// Gibbs step
template<class DerivedParameterType> // THIS IS THE PROBLEM
class GibbsStep : public Step<GibbsStep> {
public:
  GibbsStep(DerivedParameterType new_parameter) {
  }
  void DoStep() {
  }
};

Das Problem ist template<class DerivedParameterType> und die folgenden <GibbsStep> (aus dem Trick von Barton und Nackman). Mit g++ v 4.01 (OSX), erhalte ich den folgenden Fehler:

./src/mcmc.h:247: error: type/value mismatch at argument 1
 in template parameter list for 'template<class DerivedStepType> class Step'
./src/mcmc.h:247: error:   expected a type, got 'GibbsStep'

Alles lässt sich gut kompilieren, wenn ein Tropfen template<class DerivedParameterType> und ersetzen DerivedParameterType mit, sagen wir, double .

Irgendwelche Ideen?

7voto

Naveen Punkte 71443

GibbsStep ist eine Vorlagenklasse und muss während der Verwendung in public Step<GibbsStep> . Sie sollten es ändern in public Step<GibbsStep<DerivedParameterType> >

0 Stimmen

Kleine Korrektur: GibbsStep ist eine Klassenvorlage und nicht eine Vorlagenklasse ;)

1voto

ovanes Punkte 5364

Naveen hat recht, aber was Sie hier zeigen, ist kein Barton-Nackman-Trick. Es handelt sich um CRTP (Curiously Recurring Template Pattern). Sie können hier darüber lesen:

http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Curiously_Recurring_Template_Pattern

Der Burton-Nackman-Trick befasst sich mit der eingeschränkten Template-Expansion und wurde durch die Semantik der Template-Spezialisierung abgelöst. Sie können hier mehr darüber lesen:

http://en.wikipedia.org/wiki/Barton-Nackman_trick

Mit freundlichen Grüßen, Ovanes

0 Stimmen

Re " wurde von der Semantik der Vorlagenspezialisierung abgelöst" - nicht vollständig. Es gibt immer noch einige Verwendungen, wie zum Beispiel im Wikipedia-Artikel gezeigt. Concept Maps in C++0x werden diese Verwendung des Barton-Nackmann-Tricks schließlich ersetzen.

0 Stimmen

Ja, ich weiß, ich wollte den Beitrag nicht zu sehr verkomplizieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X