tutorial smart remix español curso aprender c++ templates c++11 type-deduction

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.