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>()

您也可以在函数之前使用decltypeif声明,如下所示:a

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);
}

您已经可以使用 lambda 函数来完成。

这是在 g++-4.8 中使用 std=c++1y 标志实现的。

我在这里回答:C++11 自动和函数返回类型

于 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 回答