関数を作成するには、次のように入力と出力のデータ型を宣言する必要があります。
int my_function (int argument) {}
私の関数がint型、bool型、またはchar型の変数を受け入れ、これらのデータ型を出力できるような宣言を行うことはできますか?
//non working example
[int bool char] my_function ([int bool char] argument) {}
あなたの選択は
代替1
テンプレートを使用できます
template <typename T>
T myfunction( T t )
{
return t + t;
}
代替2
単純な関数のオーバーロード
bool myfunction(bool b )
{
}
int myfunction(int i )
{
}
期待する各引数のタイプごとに異なる関数を提供します。代替案1を混在させることができます。コンパイラが最適です。
代替
ユニオンを使用できます
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();
}
#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);
テンプレート を使用:
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) { ... }
このチュートリアルを読んでください。いくつかの素晴らしい例が示されています http://www.cplusplus.com/doc/tutorial/templates/