功能模板没有<>的问题

时间:2011-03-31 12:26:22

标签: c++ templates

无论如何我可以在不写func2<int>();

的情况下做到这一点
int func() { return 5; }

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


int main()
{
    auto k = func2();
    //auto k = func2<int>();

    return 0;
}

5 个答案:

答案 0 :(得分:4)

不,因为无法推断出模板参数。您需要指定它,编译器如何知道替换它的用途? intdouble?用户定义的类型?
修改
如果你已经在使用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的答案已经说过了。