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)
,否则您将错过返回类型的引用和常量。
归档时间: |
|
查看次数: |
5938 次 |
最近记录: |