2011-12-25 16 views
12

Escribir una función debo declarar tipos de datos de entrada y salida como esta:¿es posible hacer una función que acepte múltiples tipos de datos para un argumento dado?

int my_function (int argument) {} 

¿Es posible hacer una declaración de que mi función aceptaría variable de tipo int, bool o char, y puede producir estos datos tipos?

//non working example 
[int bool char] my_function ([int bool char] argument) {} 
+1

que hay que buscar en las plantillas –

+4

se llama [Plantillas] (http: //www.iis .sinica.edu.tw/~ kathy/vcstl/templates.htm) –

+0

@SergioTulentsev Su enlace da un error 403 – pkqxdd

Respuesta

19

opciones son

ALTERNATIVA 1

puede utilizar plantillas

template <typename T> 
T myfunction(T t) 
{ 
    return t + t; 
} 

ALTERNATIVA 2

función normal sobrecarga

bool myfunction(bool b) 
{ 
} 

int myfunction(int i) 
{ 
} 

usted proporcione una función diferente para cada tipo de cada argumento tu esperas. Puedes mezclarlo Alternativa 1. El compilador será el adecuado para ti.

ALTERNATIVA 3

Puede utilizar la unión

union myunion 
{ 
    int i; 
    char c; 
    bool b; 
}; 

myunion my_function(myunion u) 
{ 
} 

ALTERNATIVA 4

Puede utilizar polimorfismo. Puede ser una exageración para int, char, bool pero útil para tipos de clases más complejas.

class BaseType 
{ 
public: 
    virtual BaseType* myfunction() = 0; 
    virtual ~BaseType() {} 
}; 

class IntType : public BaseType 
{ 
    int X; 
    BaseType* myfunction(); 
}; 

class BoolType : public BaseType 
{ 
    bool b; 
    BaseType* myfunction(); 
}; 

class CharType : public BaseType 
{ 
    char c; 
    BaseType* myfunction(); 
}; 

BaseType* myfunction(BaseType* b) 
{ 
    //will do the right thing based on the type of b 
    return b->myfunction(); 
} 
+1

¿Por qué no agregar boost :: any, void * y boost :: variant?Bien podría ir por el camino completo. – Lalaland

+1

@EthanSteinberg Por favor, siéntase libre de editar la respuesta ... Normalmente me gusta seguir con el estándar C++ –

+0

Op pregunta para devolver el mismo tipo que el argumento, no 'int' cada vez –

1

leer este tutorial, da algunos ejemplos agradables http://www.cplusplus.com/doc/tutorial/templates/

+2

Si bien esto puede responder teóricamente a la pregunta, [sería preferible] (// meta.stackoverflow.com/q/8259) incluir aquí las partes esenciales de la respuesta y proporcionar el enlace de referencia. – CodeMouse92

2

Utilice un template:

template <typename T> 
T my_function(T arg) { 
    // Do stuff 
} 

int a = my_function<int>(4); 

O simplemente sobrecarga:

int my_function(int a) { ... } 
char my_function(char a) { ... } 
bool my_function(bool a) { ... } 
5
#include <iostream> 

template <typename T> 
T f(T arg) 
{ 
    return arg; 
} 

int main() 
{ 
    std::cout << f(33) << std::endl; 
    std::cout << f('a') << std::endl; 
    std::cout << f(true) << std::endl; 
} 

de salida:

33 
a 
1 

O puede hacer:

int i = f(33); 
char c = f('a'); 
bool b = f(true); 
+0

¡Guau eso es increible! ¿Cómo funciona la plantilla? – Rhexis

+0

@Rhexis, en este caso infiere implícitamente el valor de 'typename T' en función de qué tipo es el argumento de la función 'f()' –

Cuestiones relacionadas