Можно ли сделать функцию, которая будет принимать несколько типов данных для данного аргумента? - PullRequest
18 голосов
/ 25 декабря 2011

При написании функции я должен объявить входные и выходные типы данных следующим образом:

int my_function (int argument) {}

Можно ли сделать такое объявление, чтобы моя функция принимала переменные типа int, bool или char и моглавывести эти типы данных?

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

Ответы [ 4 ]

26 голосов
/ 25 декабря 2011

Ваш выбор

АЛЬТЕРНАТИВА 1

Вы можете использовать шаблоны

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

АЛЬТЕРНАТИВА 2

Простая функция перегрузки

bool myfunction(bool b )
{
}

int myfunction(int i )
{
}

Вы предоставляете разные функции для каждого типа каждого аргумента, который вы ожидаете. Вы можете смешать это Вариант 1. Компилятор будет правильным для вас.

АЛЬТЕРНАТИВА 3

Вы можете использовать союз

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

myunion my_function( myunion u ) 
{
}

АЛЬТЕРНАТИВА 4

Вы можете использовать полиморфизм. Может быть излишним для int, char, bool, но полезно для более сложных типов классов.

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();
}
7 голосов
/ 25 декабря 2011
#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;
}

выход:

33
a
1

Или вы можете сделать:

int i = f(33);
char c = f('a');
bool b = f(true);
2 голосов
/ 25 декабря 2011

Использовать шаблон :

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

int a = my_function<int>(4);

или просто перегрузить:

int my_function(int a) { ... }
char my_function(char a) { ... }
bool my_function(bool a) { ... }
1 голос
/ 25 декабря 2011

прочитайте этот урок, он дает несколько хороших примеров http://www.cplusplus.com/doc/tutorial/templates/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...