Acabo de confundir cómo implementar algo de forma genérica en C++. Es un poco intrincado, así que déjame explicarte paso a paso.Función de la plantilla como argumento de plantilla
considerar tal código:
void a(int) {
// do something
}
void b(int) {
// something else
}
void function1() {
a(123);
a(456);
}
void function2() {
b(123);
b(456);
}
void test() {
function1();
function2();
}
es fácilmente perceptible que function1
y function2
hacer lo mismo, con la única parte diferente de ser la función interna.
Por lo tanto, quiero hacer function
genérico para evitar la redundancia del código. Puedo hacerlo usando punteros de función o plantillas. Déjame elegir este último por ahora. Mi pensamiento es que es mejor ya que el compilador seguramente podrá alinear las funciones, ¿estoy en lo correcto? ¿Los compiladores aún pueden alinear las llamadas si están hechas a través de punteros de función? Esta es una pregunta secundaria.
OK, de vuelta al punto original ... Una solución con plantillas:
void a(int) {
// do something
}
void b(int) {
// something else
}
template<void (*param)(int) >
void function() {
param(123);
param(456);
}
void test() {
function<a>();
function<b>();
}
Todo OK. Pero me encuentro con un problema: ¿aún puedo hacer eso si a
y b
son genéricos?
template<typename T>
void a(T t) {
// do something
}
template<typename T>
void b(T t) {
// something else
}
template<...param...> // ???
void function() {
param<SomeType>(someobj);
param<AnotherType>(someotherobj);
}
void test() {
function<a>();
function<b>();
}
sé que un parámetro de plantilla puede ser uno de:
- un tipo,
- un tipo de plantilla,
- un valor de un tipo.
Ninguno de esos parece cubrir mi situación. Mi pregunta principal es, por tanto: ¿Cómo lo soluciono, es decir, defino function()
en el último ejemplo?
(Sí, los punteros a las funciones parecen ser una solución alternativa en este caso, siempre que también se puedan incluir), pero estoy buscando una solución general para esta clase de problemas).
No estoy seguro de por qué esto se revocó. No es del todo satisfactorio, pero resuelve el problema. –
En resumen: ¿la única solución que permitiría alinear las llamadas es reemplazar las funciones por funtores? Un poco difícil de manejar, pero totalmente aceptable, creo. ¡Gracias! – Kos
Pero admito que estoy muy sorprendido después de que dijera que no es posible realizar una llamada por dirección ... Si la dirección puede determinarse en tiempo de compilación para que sea igual a la dirección de una función determinada, esperaría que compilador para ser lo suficientemente inteligente. :) Extraño ... – Kos