
Spanish: 
Hola!
A veces la gente se pregunta -
cuál es el sentido de las nuevas releases del estándar C++
para que sirven esos cambios?
A veces, sólo puedes entender lo que tienes -
cuando ya no lo tienes.
Así que vamos a trabajar como solíamos hacerlo antes.
En este escenario estoy creando una simple clase vector.
Una de las operaciones fundamentales de un vector es el 'cross product' (producto vectorial).
Pero, que tipo de valor genera la operación 'cross product'?
Para vectores bidimensionales, el resultado es un escalar.
Pero para vectores tridimensionales, el resultado es otro vector.
Entonces, dependiendo de la cantidad de dimensiones, debemos hacer una u otra cosa.
Veamos que tiene para decirnos el compilador.
Oh no!
Una función no puede retornar valores de diferentes tipos de dato.
No es para preocuparse!
Sólo necesitamos decirle al compilador -
que esta es una condición en tiempo de compilación,
para que el compilador pueda ignorar las ramas que fallen.
Excelente.

English: 
Hello!
Sometimes people wonder -
what is the point in
C++ language standard releases;
what are those changes good for?
Often you can only understand
what you had -
when you no longer have it.
So let's work backwards a bit.
In this scenario I am creating
a simple vector class.
One of the fundamental vector
operations is called 'cross product'.
But wait, what type of value
does a cross product produce?
For two-dimensional vectors,
the result is a scalar.
But for three-dimensional vectors,
the result is another vector.
So, depending on the number of dimensions,
we do one thing or the other.
Let's see what the compiler
has to say.
Oh no!
A function cannot
return values of different types.
Not to worry!
We just need
to tell the compiler -
that this is a
compile-time condition,
so the compiler can totally
disregard the failing branches.
Excellent.

English: 
Our C++17 capable compiler
understood the code perfectly.
But what happens if we try to
feed it to a C++14 compiler?
Uh-oh.
C++14 does not
support constexpr ifs.
We need a workaround!
I know what.
We can use overloading.
Split the different
types of cross products -
into separate functions.
Let the compiler choose
a different function -
depending on the type
of vector parameters.
Ahh.
Now it works.
But wait.
Does it also work
on a C++11 compiler?
Should have guessed.
C++11 supports automatic
function return types -
only in lambda functions.
And this is not one.
We need a workaround.
We can use…
specialization!
Let's create a mechanism that
gives a different typename -
depending on the template parameters.
This is getting
a bit cumbersome.
But at least it
compiles now, right?
Hmm, yeah.

Spanish: 
Nuestro compilador compatible con el estándar C++17 entiende el código perfectamente.
Pero que sucede si intentamos usar esto con un compilador compatible con el estándar C++14?
Oh, oh.
C++14 no soporta condicionales con constexpr.
Necesitamos una solución alternativa!
Ya se!
Podemos usar sobrecarga.
Separar los distintos tipos de 'cross product' -
en funciones distintas.
Dejemos que el compilador elija una función diferente -
dependiendo de los parámetros.
Ah.
Ahora funciona.
Pero, un momento.
Esto funciona también en un compilador compatible con el estándar C++11?
Debí adivinarlo.
C++11 soporta tipos automáticos para el retorno de funciones -
solamente en funciones lambda.
Y este no es el caso.
Necesitamos una solución alternativa.
Podemos usar...
especialización!
Vamos a crear un mecanismo que nos de un tipo diferente -
dependiendo de los parámetros del template.
Esto se está poniendo algo incómodo.
Pero al menos compila, no?
Hum, si.

Spanish: 
Pero supongamos que estás obligado a usar un compilador C++
previo al estándar C++11.
Cómo funciona mi código en un compilador compatible con el estándar C++98?
Oh, no...
Nos da errores relacionados con los variadic templates, referencias a rvalues,
y listas de inicialización extendidas.
Hablemos de una cosa a la vez.
Las listas de inicialización extendidas se resuelven fácilmente en este caso.
Simplemente cambiemos las llaves por paréntesis.
Afortunadamente esto no implica ninguna diferencia en este programa.
Pero la parte difícil es reescribir el constructor.
Podríamos hacerlo de la manera más tonta:
Creando constructores diferentes para cada caso -
en el que la cantidad de dimensiones es diferente.
Pero que pasa si llegamos a necesitar, por ejemplo,
un vector de ocho dimensiones algún día?
Necesitamos una mejor solución.
Tal vez podríamos usar el mismo truco que usa la función printf.
Argumentos en los que no se especifica la cantidad de los mismos (NdelT: variadic arguments!).
Ahora, sabes que algo está fundamentalmente mal
en tu programa C++, cuando usas va_list.

English: 
But suppose you're
stuck with a C++ compiler
from before C++11.
How does my
code fare in a C++98 compiler?
Oh no…
It reports errors from variadic
templates, rvalue references,
and extended initializer lists.
Let's address
one thing at a time.
The extended initializer
lists are easy in this case.
Just change the curly braces
into regular parentheses.
Luckily it doesn't make
a difference in this program.
But the difficult part is
how to rewrite the constructor.
We could do it the stupid way:
Create separate constructors
for each case -
where the number of
dimensions is different.
But what if we are
going to need, say,
an eight-dimensional
vector some day?
We need a better solution.
Maybe you could use the
same trick that printf uses.
Variadic arguments.
Now you know something
is fundamentally wrong
in your C++ program
when you use va_list.

Spanish: 
Hay una buena razón por la cual esto está considerado obsoleto.
Pero por desgracia, es el camino,
si estás obligado a usar un compilador viejo.
Quizás este video ayude a entender -
por que los programadores quieren usar las últimas herramientas de desarrollo!
Cuando estás obligado a usar herramientas viejas,
frecuentemente necesitas una solución alternativa sobre otra solución alternativa.
Y se pierde mucha productividad haciendo trabajo irrelevante.
Gracias por ver este video.
Nos vemos la próxima vez.
Adiós!

English: 
There is a good reason
why it is deprecated.
But alas, such is the way,
if you are stuck
with a stale compiler.
Perhaps this video
helps understand -
why programmers want
their tools be up-to-date!
When you are stuck
with old tools,
you often need a workaround
after workaround.
Much productivity is
wasted in irrelevant work.
Thanks for watching.
See you next time.
Bye!
