Dies ist eher eine konzeptionelle Frage. Ich versuche den einfachsten Weg zu finden, eine Zwei-Arg-Vorlage (die Argumente sind Typen) in eine Ein-Arg-Vorlage umzuwandeln. Das heißt, einen der Typen zu binden.Curry für Vorlagen in C++ Metaprogrammierung
Dies wäre das Meta-Programmierung Äquivalent von bind
in Boost/Std. Mein Beispiel enthält einen möglichen Anwendungsfall, bei dem std::is_same
als Vorlagenargument an eine Vorlage übergeben wird, die ein Argumentargumentvorlagenargument (std::is_same
ist eine Zwei-Arg-Vorlage), d. H. Zu TypeList::FindIf
, verwendet. Die TypeList
ist hier nicht vollständig implementiert, noch ist FindIf
, aber Sie bekommen die Idee. Es nimmt ein "unäres Prädikat" und gibt den Typ zurück, für den dieses Prädikat wahr ist, oder void
, wenn nicht ein solcher Typ.
Ich habe 2 Arbeitsvarianten, aber die erste ist kein One-Liner und die zweite verwendet eine ziemlich ausführliche BindFirst
Contraption, die nicht für nicht-type Vorlage Argumente funktionieren würde. Gibt es eine einfache Möglichkeit, einen solchen One-Liner zu schreiben? Ich glaube, die Prozedur, die ich suche, heißt currying
.
#include <iostream>
template<template<typename, typename> class Function, typename FirstArg>
struct BindFirst
{
template<typename SecondArg>
using Result = Function<FirstArg, SecondArg>;
};
//template<typename Type> using IsInt = BindFirst<_EqualTypes, int>::Result<Type>;
template<typename Type> using IsInt = std::is_same<int, Type>;
struct TypeList
{
template<template<typename> class Predicate>
struct FindIf
{
// this needs to be implemented, return void for now
typedef void Result;
};
};
int main()
{
static_assert(IsInt<int>::value, "");
static_assert(!IsInt<float>::value, "");
// variant #1: using the predefined parameterized type alias as predicate
typedef TypeList::FindIf<IsInt>::Result Result1;
// variant #2: one-liner, using BindFirst and std::is_same directly
typedef TypeList::FindIf< BindFirst<std::is_same, int>::Result>::Result Result2;
// variant #3: one-liner, using currying?
//typedef TypeList::FindIf<std::is_same<int, _>>::Result Result2;
return 0;
}
Klicken Sie here für Code in Online-Compiler Godbolt.
Da ich glaube, dass die Antwort "nein, es gibt keinen einfacheren Weg", werde ich natürlich jede Antwort akzeptieren, die einige nützliche Informationen gibt (wie Pläne, vielleicht solch ein Thi einzuschließen) ng im Standard). – haelix
Antworten auf die Frage ["Wie kann ich variadic Vorlage Template-Parameter curry?"] (Http://stackoverflow.com/q/21406726/3043539) kann hilfreich sein. – Constructor
Inspiration: http://www.boost.org/doc/libs/1_57_0/libs/mpl/doc/refmanual/bind.html – Drax