C++ 没有<&燃气轮机;

C++ 没有<&燃气轮机;,c++,templates,C++,Templates,我是否可以不用编写func2()来完成这项工作 int func(){return 5;} 模板 T func2(){return func();} int main() { 自动k=func2(); //自动k=func2(); 返回0; } 不,没有办法做到这一点。编译器没有推导模板参数的方法,因为它不考虑模板的返回类型。 如果您愿意重新发布并使用int k而不是auto k,那么您可以使用“欺骗”来实现相同的目标,方法是返回一个代理对象,该对象隐式转换为typenameT否,这是无法实现的

我是否可以不用编写
func2()来完成这项工作

int func(){return 5;}
模板
T func2(){return func();}
int main()
{
自动k=func2();
//自动k=func2();
返回0;
}

不,没有办法做到这一点。编译器没有推导模板参数的方法,因为它不考虑模板的返回类型。


如果您愿意重新发布并使用
int k
而不是
auto k
,那么您可以使用“欺骗”来实现相同的目标,方法是返回一个代理对象,该对象隐式转换为typename
T

否,这是无法实现的。编译器没有推导模板参数的方法,因为它不考虑模板的返回类型。


如果您愿意重新发布并使用
int k
而不是
auto k
,则可以使用“欺骗”来实现相同的目标,方法是返回一个代理对象,该代理对象隐式转换为typename
T

否,因为无法推导模板参数。您需要指定它,否则编译器如何知道用什么替换它<代码>整数
<代码>双倍?用户定义的类型?
编辑
如果您已经在使用C++0x(我假设是因为
auto
),则可以使用新的尾部返回类型函数样式:

auto func2() -> decltype(func()) {
  return func();
}
decltype(func())
将获取
func
的返回类型,而不实际调用它。
Edit2
好的,您甚至不需要尾部的返回类型,一个简单的
decltype
也可以:

decltype(func()) func2() { return func(); }

在返回依赖于某些或所有参数的情况下,尾部返回类型更为有用,尤其是当它们是模板化的时候。请参阅以获得详细解释。

否,因为无法推导模板参数。您需要指定它,否则编译器如何知道用什么替换它<代码>整数<代码>双倍?用户定义的类型?
编辑
如果您已经在使用C++0x(我假设是因为
auto
),则可以使用新的尾部返回类型函数样式:

auto func2() -> decltype(func()) {
  return func();
}
decltype(func())
将获取
func
的返回类型,而不实际调用它。
Edit2
好的,您甚至不需要尾部的返回类型,一个简单的
decltype
也可以:

decltype(func()) func2() { return func(); }

在返回依赖于某些或所有参数的情况下,尾部返回类型更为有用,尤其是当它们是模板化的时候。有关详细解释,请参阅。

编译器无法从指定给的返回类型推断模板参数类型。您没有向编译器提供任何返回类型的提示。因此,任何无法推导的模板参数类型都需要显式指定。

编译器无法从指定的返回类型推导模板参数类型。您没有向编译器提供任何返回类型的提示。因此,需要明确指定任何无法推导的模板参数类型。

如果使用
int
而不是
auto
,则可以使用c++03实现此语法:

int func() { return 5; }

template<class T> T func2() { return func(); }


struct Inference {
    template<typename T> operator T () { return func2<T>(); }
};

int main() {
  int k = Inference();
}
int func(){return 5;}
模板T func2(){return func();}
结构推理{
模板运算符T(){return func2();}
};
int main(){
int k=推理();
}

编辑:nvm,
Konrad Rudolph
的回答已经提到了这一点。

如果使用
int
而不是
auto
,则可以使用c++03实现这种语法:

int func() { return 5; }

template<class T> T func2() { return func(); }


struct Inference {
    template<typename T> operator T () { return func2<T>(); }
};

int main() {
  int k = Inference();
}
int func(){return 5;}
模板T func2(){return func();}
结构推理{
模板运算符T(){return func2();}
};
int main(){
int k=推理();
}

编辑:nvm,
Konrad Rudolph
的回答已经说过了。

也许你正在寻找这样的东西:

int func() { return 5; }

auto func2() -> decltype( func() )
{
  return func();
}

int main()
{
  auto k = func2();
}

但是,我不明白为什么要将
func2
作为模板,因为您总是希望它返回
int
。如果您想将
func
的结果强制转换为另一种类型,那么它可能很有用,但在这种情况下,您需要明确指定要作为返回的类型。

也许您正在寻找类似的类型:

int func() { return 5; }

auto func2() -> decltype( func() )
{
  return func();
}

int main()
{
  auto k = func2();
}

但是,我不明白为什么要将
func2
作为模板,因为您总是希望它返回
int
。如果您想将
func
的结果强制转换为另一个类型,那么它可能很有用,但在这种情况下,您需要明确指定要作为返回的类型。

为什么
func2
是一个模板?您使用的是C++0x(我猜,因为您使用的是
auto
)?为什么
func2
是一个模板?您使用的是C++0x(我猜,因为您使用的是
auto
)?它不能查看func()的返回类型吗?不,因为转换可能是有意的。但是,如果您真的需要,您可以让它从func中推断返回类型。这是:decltype(func())运行函数还是只查看它:)?@Merni:不是这样,但是如果该类提供默认构造函数,您可以做一些小动作:
decltype(ClassName().func())
。类构造函数甚至不会被调用!但是您仍然可以获得函数的返回类型。对于不需要默认构造函数的最后一条注释的不同拼写:
decltype(static_cast(0)->func())
它不能查看func()的返回类型吗?否,因为可能是有意进行转换的。但是,如果您真的需要,您可以让它从func中推断返回类型。这是:decltype(func())运行函数还是只查看它:)?@Merni:不是这样,但是如果该类提供默认构造函数,您可以做一些小动作:
decltype(ClassName().func())
。类构造函数甚至不会被调用!但是您仍然可以得到函数的返回类型