无论如何我可以在不写func2<int>();
int func() { return 5; }
template<class T>
T func2() { return func(); }
int main()
{
auto k = func2();
//auto k = func2<int>();
return 0;
}
答案 0 :(得分:4)
不,因为无法推断出模板参数。您需要指定它,编译器如何知道替换它的用途? int
? double
?用户定义的类型?
的修改
如果你已经在使用C ++ 0x(我假设是因为auto
),你可以使用新的尾随返回类型函数样式:
auto func2() -> decltype(func()) {
return func();
}
decltype(func())
会获得func
的返回类型,而不会实际调用它
的 EDIT2 强>
好的,你甚至不需要尾随的返回类型,一个简单的decltype
也可以完成工作:
decltype(func()) func2() { return func(); }
尾部返回类型对于返回依赖于部分或全部参数的情况更有用,特别是如果它们是模板化的。请参阅here以获得更好的解释。
答案 1 :(得分:2)
也许你正在寻找类似的东西:
int func() { return 5; }
auto func2() -> decltype( func() )
{
return func();
}
int main()
{
auto k = func2();
}
但是,我不明白为什么你将func2
作为模板,因为你总是希望它返回int
。如果你想将func
的结果转换为另一种类型,这可能很有用,但在这种情况下,你需要明确指定你想要作为返回的类型。
答案 2 :(得分:1)
不,没有办法做到这一点。编译器无法推断模板参数,因为它不考虑该返回类型。
如果您愿意使用int k
而不是auto k
,那么您可以使用“作弊”来实现相同的目标,方法是返回一个隐式转换为typename {{ 1}}。
答案 3 :(得分:1)
编译器无法从您指定的返回类型中推导出模板参数类型。您没有向编译器提供任何返回类型的提示。因此,需要明确指定任何无法推导出的模板参数类型。
答案 4 :(得分:1)
如果使用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();
}
编辑:nvm,Konrad Rudolph
的答案已经说过了。