¿Por qué los argumentos de plantilla predeterminados solo se permiten en plantillas de clase? ¿Por qué no podemos definir un tipo predeterminado en una plantilla de función miembro? Por ejemplo:
struct mycclass {
template<class T=int>
void mymember(T* vec) {
// ...
}
};
En cambio, C ++ obliga a que los argumentos de plantilla predeterminados solo se permitan en una plantilla de clase.
struct S { template <class R = int> R get_me_R() { return R(); } };
el parámetro de plantilla no se puede deducir del contexto.template <int N = 1> int &increment(int &i) { i += N; return i; }
, y luegoincrement(i);
oincrement<2>(i);
. Tal como están las cosas, tengo que escribirincrement<1>(i);
.Respuestas:
Tiene sentido dar argumentos de plantilla predeterminados. Por ejemplo, podría crear una función de clasificación:
C ++ 0x los presenta a C ++. Vea este informe de defectos de Bjarne Stroustrup: Argumentos de plantilla predeterminados para plantillas de función y lo que dice
fuente
double
en mi caso). Quizás no sea "general", pero ¿hay algún inconveniente con esta práctica? Gracias.error: invalid conversion from ‘int’ to ‘int*’
, alguna idea de por qué: `#include <array> #include <algorithm> #include <functional> template <typename Iterator, typename Comp = std :: less <Iterator>> void my_sort ( Iterator beg, Iterator end, Comp c = Comp ()) {std :: sort (beg, end, c); } int main () {std :: array <int, 5> ar {5,2,21,7,4}; my_sort (ar.begin (), ar.end ()); } `Para citar plantillas de C ++: La guía completa (página 207):
fuente
Hasta ahora, todos los ejemplos ofrecidos de parámetros de plantilla predeterminados para plantillas de función se pueden hacer con sobrecargas.
AraK:
podría ser:
Mío:
podría ser:
litb:
podría ser:
Stroustrup:
Podría ser:
Lo cual probé con el siguiente código:
La salida impresa coincide con los comentarios para cada llamada a f, y la llamada comentada no se compila como se esperaba.
Así que sospecho que los parámetros de plantilla predeterminados "no son necesarios", pero probablemente solo en el mismo sentido que los argumentos de función predeterminados "no son necesarios". Como indica el informe de defectos de Stroustrup, la adición de parámetros no deducidos fue demasiado tarde para que cualquiera se dé cuenta y / o realmente aprecie que hizo que los valores predeterminados fueran útiles. Por lo tanto, la situación actual se basa en una versión de plantillas de funciones que nunca fue estándar.
fuente
template<typename T = void> int SomeFunction();
. El parámetro de plantilla aquí nunca se usa, y de hecho la función nunca se llama; el único lugar al que se hace referencia es endecltype
osizeof
. El nombre coincide deliberadamente con el nombre de otra función, pero el hecho de que sea una plantilla significa que el compilador preferirá la función libre si existe. Los dos se usan en SFINAE para proporcionar un comportamiento predeterminado donde falta una definición de función.En Windows, con todas las versiones de Visual Studio puede convertir este error ( C4519 ) en una advertencia o deshabilitarlo así:
Ver más detalles aquí .
fuente
Lo que uso es el siguiente truco:
Digamos que quieres tener una función como esta:
No se te permitirá, pero lo hago de la siguiente manera:
Entonces de esta manera puedes usarlo así:
Como podemos ver, no es necesario establecer explícitamente el segundo parámetro. Tal vez sea útil para alguien.
fuente