Questa è più di una domanda concettuale. Sto cercando di trovare il modo più semplice di convertire un modello a due argomenti (gli argomenti in base ai tipi) in un modello ad un argomento. I.e, vincolando uno dei tipi.Currying per modelli in C++ metaprogramming
Questo sarebbe l'equivalente meta-programmazione di bind
in boost/std. Nell'esempio è incluso un possibile caso d'uso, ovvero lo std::is_same
come argomento del modello per un modello che accetta un argomento modello di template ad un argomento (std::is_same
come modello a due argomenti), ad esempio TypeList::FindIf
. Lo TypeList
non è completamente implementato qui, né lo è FindIf
, ma si ottiene l'idea. Ci vuole un "predicato unario" e restituisce il tipo per il quale quel predicato è vero o void
se non è di questo tipo.
Ho 2 varianti di lavoro, ma il primo non è un one-liner e il 2 utilizza un aggeggio piuttosto dettagliato BindFirst
, che non funzionerebbe per argomenti modello non di tipo. C'è un modo semplice per scrivere un one-liner così? Credo che la procedura che sto cercando si chiami 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;
}
Clicca here per il codice in Godbolt compilatore on-line.
Dal momento che ritengo che la risposta sia "no, non esiste un modo più semplice", accetterò ovviamente qualsiasi risposta che fornisca alcune informazioni utili (come ad esempio i piani per includere un tale ng nello standard). – haelix
Le risposte alla domanda ["Come posso seguire i parametri del modello di modello variadic?"] (Http://stackoverflow.com/q/21406726/3043539) può essere utile. – Constructor
Ispirazione: http://www.boost.org/doc/libs/1_57_0/libs/mpl/doc/refmanual/bind.html – Drax