Inferencia de tipo de parámetro de plantilla de C ++

Tengo una plantilla así en C ++

template struct Ptr {}; 

entonces puedo usarlo como tal:

 const int i = 0; Ptr ptr; 

o

 Ptr ptr; 

Pero no quiero especificar el tipo int o identity i dos veces, quiero usar solo

 Ptr ptr; 

y deje que el comstackdor int parte del tipo int por sí mismo.

¿Cómo puedo declarar mi plantilla para hacer eso?

He leído esta pregunta pero la respuesta es usar macros, eso no es bueno: plantilla de plantilla c ++?

¿Puedo hacer esto solo con plantillas sin macros? Estoy usando Visual C ++ 2013.

Dado que usted está preguntando acerca de una solución basada en plantillas de clase pura sin la ayuda de las definiciones de macro, entonces la respuesta es simple: por el momento (diciembre de 2014, C ++ 14) no es posible .

Esta cuestión ya ha sido identificada por el Comité estándar WG21 C ++ como una necesidad y hay varias propuestas para permitir que las plantillas deduzcan automáticamente el tipo de argumentos de plantilla sin tipo.

El más cercano es N3601 Parámetros de plantilla implícitos :

Parámetros de plantilla implícitos

El propósito de este ejemplo es eliminar la necesidad de la template redundante template idiom. Este idioma es ampliamente utilizado, con más de 100.000 hits en Google.

El objective es poder reemplazar una statement de template struct C; como la template struct C; con otra statement para que podamos instalar la plantilla como C<&X::f> lugar de tener que decir C .

La idea básica es poder decir la template struct C {/* ... */}; para indicar que T debe deducirse. Para describir con más detalle, consideramos algunos ejemplos extendidos de clases de plantilla y funciones.

[…]

La idea clave es que pasar el tipo del segundo parámetro de plantilla es información redundante porque se puede inferir usando la deducción de tipo ordinario del segundo parámetro de tipo. Teniendo esto en cuenta, proponemos que la introducción previa de un parámetro de plantilla con el uso indica que no debe pasarse explícitamente como un argumento de plantilla, sino que se deducirá de argumentos de plantilla posteriores que no sean de tipo. Esto nos permite de inmediato mejorar la usabilidad de describe_field siguiente manera.

 template struct describe_field { /* ... */ }; /* ... */ cout << describe_field<&A::f>::name; // OK. T is void(A::*)(int) cout << describe_field<&A::g>::arity; // OK. T is double(A::*)(size_t) 

Una propuesta similar es la que se incluye en Tidbits de Plantilla N3405 :

T para dos

El ejemplo motivador es un rasgo de tipo de reflexión putativo que proporciona propiedades de un miembro de la clase.

 struct A { void f(int i); double g(size_t s); }; /* ... */ cout << describe<&A::f>::name; // Prints "f" cout << describe<&A::g>::arity; // prints 1 

La pregunta es “¿cómo debería ser la statement de descripción?” Dado que toma un parámetro de plantilla sin tipo, necesitamos especificar el tipo del parámetro utilizando la expresión familiar (100k aciertos en Google) “template

 template struct describe; 

[…]

Nuestra idea clave es que pasar el tipo del segundo parámetro de plantilla es (casi siempre) información redundante porque se puede inferir usando la deducción de tipo ordinario del segundo parámetro de tipo. Teniendo esto en cuenta, proponemos que se permita que describe de la siguiente manera.

 template struct describe; /* ... */ cout << describe<&A::f>::name; // OK. T is void(A::*)(int) cout << describe<&A::g>::arity; // OK. T is double(A::*)(size_t) 

El estado actual de ambas propuestas se puede rastrear en la edición 9 del EWG .

Hay algunas otras discusiones que proponen una syntax alternativa con auto :

 template  struct describe;