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");
}
};
Code: Select all
template
concept IC = requires(T t, std::string_view message)
{
t.Log(message);
};
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

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;
was ich mit meinem Vorlagenparameter machen soll:

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?
Mobile version