2011-04-11 17 views
16

¿Es de alguna manera posible? Quiero que para habilitar el paso de argumentos en tiempo de compilación. Supongamos que es solo para comodidad del usuario, ya que uno siempre puede escribir el tipo real con template<class T, T X>, pero para algunos tipos, es decir, funciones de puntero a miembro, es bastante tedioso, incluso con decltype como acceso directo. Considere el siguiente código:¿Es posible emular la plantilla <auto X>?

struct Foo{ 
    template<class T, T X> 
    void bar(){ 
    // do something with X, compile-time passed 
    } 
}; 

struct Baz{ 
    void bang(){ 
    } 
}; 

int main(){ 
    Foo f; 
    f.bar<int,5>(); 
    f.bar<decltype(&Baz::bang),&Baz::bang>(); 
} 

¿Sería de alguna manera posible convertirlo a lo siguiente?

struct Foo{ 
    template<auto X> 
    void bar(){ 
    // do something with X, compile-time passed 
    } 
}; 

struct Baz{ 
    void bang(){ 
    } 
}; 

int main(){ 
    Foo f; 
    f.bar<5>(); 
    f.bar<&Baz::bang>(); 
} 
+0

@GMan: Actualizado, espero que tenga más sentido ahora. :) – Xeo

Respuesta

12

Después de su actualización: no. No existe tal funcionalidad en C++. Las macros más cercana es:

#define AUTO_ARG(x) decltype(x), x 

f.bar<AUTO_ARG(5)>(); 
f.bar<AUTO_ARG(&Baz::bang)>(); 

suena como usted quiere un generador:

template <typename T> 
struct foo 
{ 
    foo(const T&) {} // do whatever 
}; 

template <typename T> 
foo<T> make_foo(const T& x) 
{ 
    return foo<T>(x); 
} 

Ahora en vez de detallar:

foo<int>(5); 

que puede hacer:

make_foo(5); 

Para deducir el argumento.

+4

Esto es aún más útil en C++ 0x, donde puedes usar 'auto my_foo (make_foo (5));' sin tener que nombrar el tipo 'foo ' en su totalidad. –

+0

si pasar el argumento a una función hubiera sido una preocupación, entonces asker podría haber usado directamente 'f.bar (5);' y declarar el método simplemente como 'plantilla void bar (T &X);'. ¿De qué sirve su 'make_foo()'? – iammilind

+0

@iammilind: Fue una vieja suposición, antes de aclararlo – GManNickG

1

NO es posible. La única manera de lograr es argumento pase en la función de:

struct Foo{ 
    template<class T> void bar(T& X) {} 
}; 

Y a continuación, llamar a la función que,

f.bar(5); 
f.bar(&Baz::bang); 
2

Fue añadida en C++ 17 Ahora se puede escribir

template<auto n> struct B { /* ... */ }; 
B<5> b1; // OK: non-type template parameter type is int 
B<'a'> b2; // OK: non-type template parameter type is char 

Ver http://en.cppreference.com/w/cpp/language/template_parameters, punto 4 de de tipo Non parámetro de plantilla sec

Cuestiones relacionadas