转发decltype检测 - C ++ 11

时间:2012-12-18 02:51:43

标签: c++ c++11 g++ decltype

我想使用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);
}

但是这个代码不能在Linux上的g++-4.7.2下编译,因为你很容易猜到。

有一个解决方法吗?我知道auto但这不是我想要使用的内容(我不想将auto用于foo()的返回类型。

4 个答案:

答案 0 :(得分:2)

您可以使用模板

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

并使用foo<float>()

进行调用

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

auto a = 5.3f;

decltype(a) foo()
{
   return 4.3f;  
}

答案 1 :(得分: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;
}

答案 2 :(得分: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 auto and function return types

答案 3 :(得分: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);
}