Ist es auch möglich, diese Prädikate für Algorithmen zur Kompilierungszeit wiederzuverwenden, da Konzepte als Prädikate zur Kompilierungszeit definiert sind? Wäre es beispielsweise möglich zu überprüfen, ob alle Typen in einem Tupel einem Konzept entsprechen? Soweit ich gesehen habe, ist es nicht möglich, ein Konzept in irgendeiner Weise an eine Funktion zu übergeben, was mich zurückführt, Vorlagen für diese Fälle zu verwenden.
#include <type_traits>
template<typename T>
concept FloatLike = std::is_same_v<T, float>;
struct IsFloat
{
template<typename U>
constexpr static bool test()
{
return FloatLike<U>;
}
};
template<typename Predicate, typename... T>
constexpr bool all_types()
{
return (Predicate::template test<T>() && ...);
}
int main()
{
static_assert(all_types<IsFloat, float, float>());
static_assert(!all_types<IsFloat, float, int>());
}
Was ich gerne machen würde, ist so etwas, also muss ich das Konzept nicht die ganze Zeit einpacken, um es verwenden zu können:
template<concept Predicate, typename... T>
constexpr bool all_types()
{
return (Predicate<T> && ...);
}
int main()
{
static_assert(all_types<FloatLike, float, float>());
static_assert(!all_types<FloatLike, float, int>());
}
Gibt es eine Möglichkeit, dem näher zu kommen?
all_types()
kann mit Fold-Ausdrücken erheblich vereinfacht werden... &&
:return (... && Predicate::template test<Ts>());
Antworten:
Nein, nicht wirklich. Nicht in C ++ 20. In der heutigen Sprache gibt es keinen Begriff für einen Vorlagenkonzeptparameter. Auch variable Vorlagen können nicht als Vorlagenparameter verwendet werden. Wenn Sie also zunächst ein Konzept haben, können wir das Umwickeln nicht vermeiden.
Wir können jedoch einfachere Wrapper schreiben. Wenn wir uns damit einverstanden erklären, Merkmale vom Typ "alter Stil" als Prädikate zu verwenden, insbesondere solche, die sich wie
std::integral_constant
s verhalten , können wir ziemlich knappe "Konzept" -Definitionen haben, die als Prädikate verwendet werden können.Es ist so gut wie es nur geht , soweit ich sehen kann.
quelle
Wenn Ihr Ziel darin besteht, "zu überprüfen, ob alle Typen in einem Tupel einem Konzept entsprechen" , können Sie Folgendes tun:
LIVE DEMO
quelle
AllSame
Variadic? Jeder Vorlagenparameter in einem Paket, der durch eine Typbeschränkung eingeführt wird , ist bereits separat eingeschränkt.*_foo()
?...
aufTs
und die ,&& ...
die es verwendet. (Natürlich wäre der NameAllSame
dann unangemessen, aber ich bin mir nicht sicher, warum ich<int,int,int>
sowieso eine Zählung in unär ausdrücken möchte .)AllSame
alsSameAs
(siehe en.cppreference.com/w/cpp/concepts/same_as ) und OP wollten ein Konzept, das eine unterschiedliche Anzahl von Vorlagenparametern akzeptiert.std::same_as
. Ich glaube nicht, dass der variadische Teil der Punkt war: Es war die (gewünschte) variable Identität des Konzepts. Mein Punkt war, dass der variadische Aspekt Ihres Konzeptbeispiels für seine Verwendung irrelevant war (da nicht variadische Konzepte bereits mit Vorlagenparameterpaketen funktionieren).