0

decltypeメソッドの戻り型をそのような変数の型に仮想的にバインドするために使用したいと思います

#include <iostream>

decltype(a) foo()                     // my point
{
  return 4.3f;
}

int main(int argc, char* argv[])
{
  auto a = 5.5f;
  std::cout << foo() << std::endl;
  return(0);
}

g++-4.7.2しかし、簡単に推測できるように、このコードはLinuxではコンパイルされません。

これには回避策がありますか?私は知ってautoいますが、これは私が使用したいものではありません(私はautoのリターンタイプには使用したくないfoo())。

4

4 に答える 4

2

テンプレートを使用できます

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

を使用して呼び出しますfoo<float>()

decltype次のように、 ifaを関数の前に宣言することもできます。

auto a = 5.3f;

decltype(a) foo()
{
   return 4.3f;  
}
于 2012-12-18T02:57:19.170 に答える
1

ここでのあなたの目標は正確には何ですか?変数を関数に渡しても大丈夫ですか?そうでない場合、関数はどのタイプを使用するかをどのように知ることが期待されますか?変数を関数に渡しても問題がない場合は、テンプレートを使用できます。

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;
}
于 2012-12-18T03:09:12.380 に答える
1

C++1y を使用すると、次のことが可能になります。

#include <iostream>

auto foo()
{
  return 4.3f;
}

int main(int argc, char* argv[])
{
  auto a = 5.5f;
  std::cout << foo() << std::endl;
  return(0);
}

これは、ラムダ関数で既に実行できます。

これは g++-4.8 で std=c++1y フラグを使用して実装されています。

私はここで答えました: C++11 auto および function return types

于 2012-12-18T04:48:28.520 に答える
0

これはあなたが求めているものですか?コンパイルする必要があります。

#include <iostream>

const float foo() 
{
  return 4.3f;
}

int main(int argc, char* argv[])
{
  decltype(foo()) a;
  a = foo();
  std::cout << a << std::endl;
  return(0);
}
于 2012-12-18T02:59:35.027 に答える