我想使用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()
的返回类型。
答案 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标志实现的。
答案 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);
}