Currículum para plantillas en metaprogramación C ++

Esta es más una pregunta conceptual. Estoy tratando de encontrar la forma más fácil de convertir una plantilla de dos argumentos (los argumentos son tipos) en una plantilla de un argumento. Es decir, unir uno de los tipos.

Este sería el equivalente de metaprogramación debind en boost / std. Mi ejemplo incluye un posible caso de uso, que es pasarstd::is_same como argumento de plantilla a una plantilla que toma un argumento de plantilla de plantilla de un argumento (std::is_same ser una plantilla de dos argumentos), es decir,TypeList::FindIf. losTypeList no se implementa completamente aquí, tampocoFindIf, Pero se entiende la idea. Toma un "predicado unario" y devuelve el tipo para el que ese predicado es verdadero, ovoid si no es de ese tipo.

Tengo 2 variantes de trabajo, pero la primera no es de una sola línea y la segunda usa una versión bastante detalladaBindFirst artilugio, eso no funcionaría para argumentos de plantilla sin tipo. ¿Hay una manera simple de escribir una frase así? Creo que el procedimiento que estoy buscando se llamacurrying.

#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;
}

Hacer clicaquí para el código en el compilador en línea GodBolt.

Respuestas a la pregunta(2)

Su respuesta a la pregunta