Boost-DI mit konzeptbasiertem statischen PolymorphismusC++

Programme in C++. Entwicklerforum
Anonymous
 Boost-DI mit konzeptbasiertem statischen Polymorphismus

Post by Anonymous »

Ich verwende Boost.DI und habe viel Erfolg beim Erlernen gehabt. Allerdings bin ich auf eine Falte gestoßen, die ich nicht genau beheben kann.
Das Folgende wird wie erwartet kompiliert, verknüpft und ausgeführt:

Code: Select all

class CC
{
public:
void Log(std::string_view) {}
};

template
class Host
{
TC& c;

public:
BOOST_DI_INJECT(Host, TC& c)
: c(c)
{
c.Log("moop");
}
};
Das Problem ist, dass es nirgendwo ein Konzept gibt, das angewendet wird. Ich kann den Code schreiben und bekomme Fehler bei der Kompilierung, aber ich erhalte keine Vervollständigung des Intellisense-Codes, da Host zum Zeitpunkt des Schreibens noch keine Ahnung hat, was dieser TC ist. Das ist besonders schlimm, weil es trivial ist, ein Konzept dafür bereitzustellen:

Code: Select all

template
concept IC = requires(T t, std::string_view message)
{
t.Log(message);
};
Der Versuch, das Konzept anzuwenden, führt jedoch zur Kompilierungszeit zu einem Fehler, der besagt, dass das Konzept fehlschlägt, weil TC unvollständig ist:

Code: Select all

template //               (...)\include\boost\di.hpp(2792,103):
1>              'Host': the associated constraints are not satisfied
1>                  (...)\main.cpp(28,10):
1>                  the concept 'IC' evaluated to false
1>                      (...)\main.cpp(19,2):
1>                      use of undefined type 'C'
1>                      (...)\main.cpp(28,18):
1>                      see declaration of 'C'
1>                      (...)\main.cpp(19,4):
1>                      left of '.Log' must have class/struct/union
Aber selbst wenn es fehlschlägt, erhalte ich mein Intellisense jetzt wie erwartet, sodass ich glaube, dass es machbar ist:
Image

Laut offizieller Dokumentation sind die Konzepte für die Verwendung mit einem Zweig für nicht vorgesehen is_complete, um unvollständige Typen zuzulassen:

Code: Select all

template
concept IC = requires(T t, std::string_view message)
{
t.Log(message);
} or not boost::di::aux::is_complete::value;
Dies funktioniert erneut ordnungsgemäß und überprüft, ob die Funktion zur Kompilierungszeit vorhanden ist, aber Intellisense schlägt erneut fehl. Soweit ich das beurteilen kann, nimmt es nur den unvollständigen Typzweig (vielleicht weil er am freizügigsten ist?) Und hat daher keine Ahnung,
was ich mit meinem Vorlagenparameter machen soll:
Image

Gibt es also eine Möglichkeit, diese Bibliothek mit konzeptbasiertem Polymorphismus arbeiten zu lassen? Intellisense auch funktionieren lassen? Vielleicht mit einem modernen C++-Konzept (kein Wortspiel beabsichtigt), mit dem ich nicht vertraut bin?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post