c++ - smart - solidity español
Deducción de la función (3)
Gracias a la adopción de la deducción de parámetros de la plantilla para los constructores, en C ++ 17, podrá simplemente escribir:
A a(::close, 1);
Antes de eso, solo tendrá que escribir una fábrica para hacer la deducción por usted:
template <class F, class... Args>
A<std::decay_t<F>> make_a(F&& f, Args&&... args) {
return {std::forward<F>(f), std::forward<Args>(args)...};
}
auto a = make_a(::close, 1);
Esto es un poco detallado, pero al menos no necesita preocuparse por la eficiencia: no habrá copias aquí gracias a RVO.
Digamos que tenemos una plantilla de clase como esta:
template<typename F>
class A
{
public:
template<typename... Args>
A(F f, Args... args)
{ /* Do something... */ }
};
Y ahora quiero usarlo de alguna manera como este:
A<int(int)> a(::close, 1);
Ahora la pregunta: ¿hay alguna manera de omitir el <int(int)>
porque un compilador puede conocer esta información para el ::close
? No es necesario guardar el "diseño" de la plantilla.
En cuanto a la tarea concreta, necesito diseñar una plantilla de una clase. Los objetos de esta clase podrían tomar una función y parámetros para esta función en tiempo de construcción y llamar a esta función más tarde.
No puede omitir los argumentos de una clase de plantilla, a menos que estén predeterminados. Lo que puede hacer es tener una función de fabricante que deduzca el argumento y reenvíe este argumento a la clase de plantilla, devolviendo un objeto de la instanciación apropiada.
template<typename F, typename... Args>
A<F> make_A(F f, Args&&... args) {
return A<F>(f, std::forward<Args>(args)...);
}
No, usted (actualmente) no puede. La forma estándar de hacerlo es creando la función "make_like" (como make_pair
, make_optional
...):
template<typename F, typename... Args>
A<std::decay_t<F>> make_A (F &&f, Args&&... args) {
return {std::forward<F>(f), std::forward<Args>(args)...};
}
C ++ 17 introducirá la deducción del argumento de la plantilla para la clase, lo que le permitirá hacer exactamente lo que quiera.