函数模板返回类型推导

man*_*tta 11 c++ templates c++11 c++14

我有一些类Cconst和非const一些泛型类型干将Node:

template <typename NodeType>
class CParent{};

class Node {};

class C : public CParent<Node> {
    Node&       getNode(Index i);
    const Node& getNode(Index i) const;
};
Run Code Online (Sandbox Code Playgroud)

现在我想创建一个调用getNode类对象的别名函数C:

template <class CType>
NodeType& AliasGetNode(CType* cobject);
Run Code Online (Sandbox Code Playgroud)

但是我如何演绎NodeType呢?也就是说,如果我叫AliasGetNode<const C>(c)AliasGetNode<C>(c),NodeType应分别为const Node&Node&.

我怎样才能做到这一点?

我试过result_ofdecltype方法,但都没有成功.

Mic*_*ann 20

让编译器推导出返回类型(从C++ 14开始):

template <class CType>
decltype(auto) AliasGetNode(CType& cobject)
{
    return cobject.getNode(0);
}
Run Code Online (Sandbox Code Playgroud)

  • 太好了!在c ++ 11中你也可以做`auto AliasGetNode(CType&cobject) - > decltype(cobject.getNode(0))` (4认同)
  • @Potatoswatter - 麻烦.`decltype(auto)`将在OP的情况下推导出一个引用类型.如果OP需要按值返回,它将正确推导出"Node".这不是滥用.OP想要完全返回`getNode()`的声明类型.`decltype(auto)`是正确的推论. (4认同)
  • @StoryTeller这听起来像是一个虫子在到达单元测试之前停在其轨道上. (2认同)
  • @Potatoswatter - 您对该提案有参考吗?听起来很有趣. (2认同)

W.F*_*.F. 12

我会推荐:

template <class CType>
auto AliasGetNode(CType& cobject) -> decltype(cobject.getNode(0))
{
    return cobject.getNode(0);
}
Run Code Online (Sandbox Code Playgroud)

从c ++ 11开始,这应该可以正常工作

  • 为什么不使用C++ 14使这更正确?如果有的话,这会使情况变得更糟,你在问题中标记了`c ++ 14`. (2认同)

Rei*_*ica 5

定义一个简单的帮助器特征,它将const根据另一个类型是否在类型中添加/删除const:

template <class Src, class Dst>
using copy_const = typename std::conditional<
  std::is_const<Src>::value,
  const Dst,
  typename std::remove_const<Dst>::type
>::type;
Run Code Online (Sandbox Code Playgroud)

并使用它:

template <class CType>
copy_const<CType, NodeType>& AliasGetNode(CType* cobject);
Run Code Online (Sandbox Code Playgroud)


Edg*_*jān 5

从 C++14 开始,编译器可以推导出函数的返回类型:

template<typename CType>
decltype(auto) AliasGetNode(CType& cobject) {
    return cobject.getNode();
}
Run Code Online (Sandbox Code Playgroud)

当您调用AliasGetNode类型为 的对象时NodeCType会推导为Node。但如果你调用AliasGetNode类型为的对象const NodeCType则推导为const Node

AliasGetNode将返回类型设置为as很重要decltype(auto),否则您将错过返回类型的引用和常量。

  • `decltype(auto)` 不保证引用返回类型。`auto &amp;` 和 `auto const &amp;` 可以。 (2认同)