Considere la siguiente clase, con la estructura interna Y
que se utiliza como un tipo, por ejemplo. en las plantillas, más tarde:Inclusión/exclusión en tiempo de compilación condicional basada en argumento (s) de plantilla?
template<int I>
class X{
template<class T1>
struct Y{};
template<class T1, class T2>
struct Y{};
};
Ahora, en este ejemplo, obviamente, no se compile, con el error de que el segundo X<I>::Y
ya se ha definido o que tiene demasiados parámetros de plantilla.
Me gustaría resolver eso sin especialización parcial (extra), ya que el parámetro int I
no es el único y la posición de este puede diferir en diferentes especializaciones parciales (mi estructura real se ve more like this, lo anterior es solo por simplicidad de la pregunta), así que me gustaría one class fits every I
solución.
Mi primer pensamiento fue, obviamente, enable_if
, pero que parece fallar en mí, por ejemplo. Sigo teniendo los mismos errores:
// assuming C++11 support, else use boost
#include <type_traits>
template<int I>
class X{
template<class T1, class = std::enable_if<I==1>::type>
struct Y{};
template<class T1, class T2, class = std::enable_if<I==2>::type>
struct Y{};
};
lo tanto, ya enable_if
falla, espero que no haya otra manera de alcanzar la siguiente comprobación en tiempo de compilación:
template<int I>
class X{
__include_if(I == 1){
template<class T1>
struct Y{};
}
__include_if(I == 2){
template<class T1, class T2>
struct Y{};
}
};
sólo habría ser para salvarme mucho de duplicación de código, pero estaría muy feliz si fuera de alguna manera posible.
Editar: Tristemente, no puedo usar lo obvio: plantillas variadic, ya que estoy usando Visual Studio 2010, así que solo puedo usar las cosas de C++ 0x que hay allí. :/
+1. Interesante pregunta. Trataré de responderlo después del horario de oficina: D – Nawaz
Lo estoy esperando con placer. :) Mi línea de pensamiento es que debería ser posible ya que el compilador sabe todo lo que necesita saber, bueno, tiempo de compilación. – Xeo
@Xeo: ¿Se te permite usar C++ 0x feautures? – Nawaz