man*_*tta 11 c++ templates c++11 c++14
我有一些类C与const和非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_of和decltype方法,但都没有成功.
Mic*_*ann 20
让编译器推导出返回类型(从C++ 14开始):
template <class CType>
decltype(auto) AliasGetNode(CType& cobject)
{
return cobject.getNode(0);
}
Run Code Online (Sandbox Code Playgroud)
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开始,这应该可以正常工作
定义一个简单的帮助器特征,它将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)
从 C++14 开始,编译器可以推导出函数的返回类型:
template<typename CType>
decltype(auto) AliasGetNode(CType& cobject) {
return cobject.getNode();
}
Run Code Online (Sandbox Code Playgroud)
当您调用AliasGetNode类型为 的对象时Node,CType会推导为Node。但如果你调用AliasGetNode类型为的对象const Node,CType则推导为const Node。
AliasGetNode将返回类型设置为as很重要decltype(auto),否则您将错过返回类型的引用和常量。