ここでのあなたの目標は正確には何ですか?変数を関数に渡しても大丈夫ですか?そうでない場合、関数はどのタイプを使用するかをどのように知ることが期待されますか?変数を関数に渡しても問題がない場合は、テンプレートを使用できます。
template<typename T>
T foo(T) {
return 4.3f;
}
今、あなたはそれを次のように呼ぶことができます
std::cout << foo(a) << std::endl;
ここでの変数は、その型を取得するためにのみ使用されています。変数を渡したくない場合は、型を直接指定する必要があります。たとえば、
template<typename T>
T foo() {
return 4.3f;
}
std::cout << foo<decltype(a)>() << std::endl;
しかし、もちろん、これはかなり醜いです。
ここで、マクロを使用する場合は、これを少し単純化できます。
template<typename T>
T _foo() {
return 4.3f;
}
#define foo() _foo<decltype(a)>()
std::cout << foo() << endl;
しかしもちろん、これはfoo()を呼び出すときにスコープ内になければならない変数の名前をハードコーディングします。
ここでの基本的な問題は、関数が最初に宣言されるため、関数が変数の型を暗黙的に使用できないことです。したがって、テンプレートが適切なソリューションではない場合、唯一の代替手段は、関数と変数の両方がアクセスできる場所で型を宣言することです。これは、次の方法で実行できますtypedef
。
typedef float atype;
atype foo() {
return 4.3f;
}
int main() {
atype a = 5.5f;
std::cout << foo() << std::endl;
}
foo()
または、の戻り値が問題のタイプの権限と見なされることを簡単に決定できます。
float foo() {
return 4.3f;
}
int main() {
decltype(foo()) a = 5.5f;
std::cout << foo() << std::endl;
}