C++ Wie auf Vorgefertigte Funktionen, die mit std::bind / std::function

Wenn Sie eine vorgefertigte Klasse oder eine Vorlagen-Funktion (oder Kombination aus beiden), wie binden Sie diese Funktion, (die Erhaltung der template-parameter type)?

Bekam ich etwas Hilfe, um die grundlegende syntax in einem post weiter unten zu binden, um Funktionen mit expliziten template-type-Parameter, verlieren aber die Fähigkeit, template type Parameter in den Prozess.

Ist es möglich, diese so zu arbeiten, dass es noch möglich ist, eine Vorlage-Typ-Parameter mit Zukunft ruft?

Gereinigt bis dieser code viel, aber es wird offensichtlich nicht kompilieren, weil ich nicht finden können, die richtige syntax (gibt es irgendwelche Möglichkeiten, dies zu tun)?

Entfernt die "vector" - Anforderung zu vereinfachen:

Danke für die Hilfe!

#include <functional>
#include <vector>
#include <string>

/***************************************/
template <typename CommandTemplateType>
class Storage
{
  public:
   //No idea how to define this vector to allow Template Parameters
   //static std::vector<std::function<void<ParameterTemplateType>
   //    (std::shared_ptr<ParameterTemplateType>)>> Functions;

   //I really don't need the collection, a single member would kick start my research:
   static std::function<void<ParameterTemplateType>(std::shared_ptr<ParameterTemplateType>)> Function;

  template <typename ParameterTemplateType>
  static void Execute(ParameterTemplateType parameter)
  {
     //Look up index, or loop through all.. 
     //I am trying to invoke the bound function with a template param:
     //Functions[index]<ParameterTemplateType>(parameter);
     //preferably, just:  
     Function<ParameterTempalteType>(parameter); 
  }
};

/***************************************/
template <typename TemplateType>
class MyClass
{

   template <typename ParameterTemplateType>
   void MyFunction(ParameterTemplateType myParameter)
   {
     //Do something; 
   }

   MyClass()
   {
      std::string parameter = L"Test String";

      //Do not know how to include the 
      //template<typename ParameterTemplateType> definition to bind call.
      //Storage::Functions.push_back(
      //    std::bind(&MyClass::MyFunction<ParameterTemplateType>,
//       this, std::placeholders::_1));

     //Or just something like:
     Storage::Function = std::bind(&MyClass::MyFunction<ParameterTemplateType>,
                             this, std::placeholders::_1));

      /***************************************/
      //Call the bound function with an explicit parameter somehow:
      std::string parameter = L"Test String";          
      Storage::Execute<std::string>(parameter);


   }
};
  • Was wollen Sie übergeben werden, als myParameter?
  • Anmerkung zur Terminologie: es gibt keine solche Sache wie eine "vorgefertigte Klasse/Funktion". Es gibt Klassen-templates und Funktions-templates. Das ist ein ganz fundamentaler Unterschied: es ist nicht so, dass etwas (eine "Vorlage", was immer das ist) wird auf eine Klasse angewendet. Es ist Umgekehrt: eine Klasse Vorlage selbst ist eine Vorlage, ein Modell oder eine Form, aus dem erstellen einer konkreten Klasse (durch einfügen von template-Argumente). Denken Sie an eine Klasse Vorlage, wie ein Schimmel, von dem aus ein Schwert (= Klasse), nicht wie ein Schwert, mit einigen Verzierungen auf Sie.
  • Wenn ich verstehe, was du fragst richtig, es ist unmöglich. std::bind ist ein run-time-Konzept, Rückgabe von (im wesentlichen) eine Funktion, die aufgerufen werden können. Die Instanziierung einer Funktion Vorlage (ausfüllen der Vorlage-parameter) werden muss, geschieht bei der Kompilierung. Sie kann nicht laufen-Zeit binden, um eine Funktion, die (möglicherweise) noch kompiliert werden müssen...
  • Ich fand heraus, wie es zu tun. Sie haben, um wickeln Sie die Vorlagen-Funktion in eine vorgefertigte container von einer Art sein. Habe ich geschrieben, die Antwort unten. Vielen Dank an alle für all die Hilfe!
Schreibe einen Kommentar