¿Se puede pasar una plantilla variable como argumento de plantilla?


11

El siguiente ejemplo sin sentido no se compila, pero ¿hay alguna otra forma de pasar una plantilla variable como argumento de plantilla?

template<typename T>
constexpr auto zero = T{0};

template<typename T, template<typename> auto VariableTemplate>
constexpr auto add_one()
{
    return VariableTemplate<T> + T{1};
}

int main()
{
    return add_one<int, zero>();
}

Probar en el Explorador de compiladores

Respuestas:


3

Respuesta corta: no.

Respuesta larga: Sí, puede usar alguna indirección a través de una plantilla de clase:

template<typename T>
constexpr auto zero = T{0};

template<typename T>
struct zero_global {
    static constexpr auto value = zero<T>;
};

template<typename T, template<typename> class VariableTemplate>
constexpr auto add_one()
{
    return VariableTemplate<T>::value + T{1};
}

int main()
{
    return add_one<int, zero_global>();
}

Ejemplo en vivo


Parece un poco al revés que uno tiene que recurrir a la estructura con un miembro estático. ¿Es esto algo que uno puede esperar que venga con un estándar futuro? ¿Alguna idea de por qué ya no es posible hoy?
idclev 463035818

1
@ formerlyknownas_463035818 No creo que nadie lo haya propuesto todavía (nunca lo vi en el periódico, ¿tal vez me lo perdí?) Y también hay una complejidad. En este momento, los parámetros de plantilla que no son de tipo son valores pr. ¿Pero qué value<T>significaría? ¿Una referencia a la variable global? Además, no puede ODR usar parámetros de plantilla que no sean de tipo, pero puede hacerlo con una plantilla global.
Guillaume Racicot

gracias por las sugerencias, todavía estoy en c ++ 11, así que no estoy muy familiarizado con las plantillas variables, y eso es algo que hubiera esperado que saliera de la caja
idclev 463035818
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.