2010-08-10 18 views
8

tengo un pequeño problema con las plantillas:C++ plantilla predeterminada Constructor

template <typename T> 
T Func(){ 
    std::string somestr = ""; 
    // somestr = ... 
    if (somestr != ""){ 
     return boost::lexical_cast<T>(somestr); 
    } 
    else{ 
     T ret; // warning: "ret may be uninitialized in this function" 
     return ret; 
    } 
} 

Si esta función falla para obtener un resultado, quiero devolver un objeto válido, pero lo más vacío posible. Si lo hago como se muestra arriba, aparece la advertencia "ret puede estar desinicializado en esta función". Try-Catch no ayuda a eliminar la advertencia ..

¿Hay alguna manera de que esto sea como la palabra clave default en C#?

return default(T); // C# 

¡Gracias!

Respuesta

21

ret podría estar sin inicializar porque T podría ser un tipo POD u otro tipo que no tenga constructores declarados por el usuario.

puede invocar el constructor por defecto (y el valor-inicializar un objeto de tipo POD) de esta manera:

T ret = T(); 
return ret; 

o, más brevemente,

return T(); 

Esto supone que T es por defecto Urbanizable . Si necesita crear una instancia de esta función con un tipo que no sea construible por defecto, puede tomar el caso "predeterminado" como parámetro. Por ejemplo,

template <typename T> 
T Func(const T& default_value = T()) 
{ 
    // ... 
} 

Esto le permitirá todavía a llamar Func() para los tipos que son construibles por defecto, sino también para proporcionar explícitamente un valor para volver a los tipos que no son.

+2

Muy buena respuesta James. – user373215

Cuestiones relacionadas