2010-11-17 30 views
5

¿Hay alguna actualización en el próximo estándar de C++ 0x en parámetros con nombre en las plantillas y/o funciones? Por ejemplo, me gustaría ser capaz de escribir la siguiente:¿Nombrado? parámetros en las plantillas, funciones

haber definido previamente:

template<class T = int,class Policy_1, class Policy_2> 
class X 
{ 
}; 

entonces en principal:

X<Policy_2: NoReturn> x; 

esta misma con funciones; que presenta:

void f(int arg_1 = 0, int arg_2 = 1, int arg_3 = 2) 
{ 
} 

entonces en el principal:

f(arg_3: 55); 

Respuesta

9

Para las funciones puede usar el Parámetros con nombre Idiom (tanto en C++ 98 como en C++ 0x).

Ver C++ FAQ elemento 10.20 What is the "Named Parameter Idiom"?.

Para argumentos de plantilla Creo que se puede utilizar la idea de envolver, el uso de "portador del tipo" tipos que por su tipo que codifican parámetro de plantilla que son. Se vuelve complejo. Es posible que echa un vistazo a la biblioteca Boost Parámetros para las ideas, pero en esencia, de argumentos de plantilla no creo que vale la pena gastar tiempo en (por no hablar de utilizar realmente) - es académico.

Saludos & HTH.,

+0

+1 por no decir falsamente que es imposible: p –

+1

He encontrado una muchos usos para eso sin embargo. Cuando se trabaja con un diseño basado en políticas, donde puede haber 10 o más parámetros de plantilla, es MUY útil. Boost.Parameter crea código de implementación desordenado, pero limpio y fácil de usar. –

+0

@Noah: el MPL es suficiente para este (junto con la idea de portador del tipo). Otra solución que he encontrado es simplemente pedir que se defina un tipo interno de 'etiqueta' en cada política que identifica a qué categoría pertenece.Ambos son relativamente delgados. –

0

No, eso no va a trabajar en C++ 0x.

8

No con esa sintaxis y aunque se hace más fácil de usar, tales construcciones, la creación de ellos es bastante desordenado.

Ver Boost.Parameter

Se termina con

typedef template_by_named< policy1<type1>, policy2<type2> > x; 

y

f(param_b = 23, param_d = 42) 
+3

A veces me pregunto si hay algo de Dave Abrahams no podía escribir en C++ ... –

-4

El resto de nosotros sólo se utiliza estructuras de argumentos y lo superó. Y no.

+8

-1 inútilmente desagradable y poco. –

+1

+1, razonablemente concisa y veraz. – MSN

+0

Me gustaría señalar http://www.boost.org/doc/libs/1_44_0/libs/parameter/doc/html/index.html – KitsuneYMG

0

This article describe una técnica que se puede utilizar para emular los parámetros de plantilla con nombre.

Ejemplo de sintaxis:

enum class bars { bar1, bar2, bar3 }; 

// Omitted definitions of get_value, is_present, get_type, a, b, c and d. 

template <typename... Args> 
struct foo { 
    static constexpr auto A = get_value<a<1>, Args...>::value; 
    static constexpr auto B = get_value<b<bars::bar2>, Args...>::value; 
    static constexpr auto C = is_present<c, Args...>::value; 

    using D = typename get_type<d<char>, Args...>::value; 
}; 

// Client code 
foo<d<float>, a<42>> f; 
// f::A equals to 42; 
// f::B equals to defaulted bars::bar2; 
// f::C equals to false, because c is not present among temlate arguments; 
// f::D equals to float 
Cuestiones relacionadas