C++模板专门化,对可以是指针或引用的类型调用方法
C++ template specialization, calling methods on types that could be pointers or references unambiguously
摘要
有没有一种方法可以在模板化类型上调用类方法,该类型可以是指针或引用,而不知道是哪一个,也不会得到编译器/链接器错误?
详细信息
我有一个模板化的QuadTree实现,它可以采用以下任何非平凡的用户定义类型:
//Abstract Base Class
a2de::Shape
//Derived Classes
a2de::Point
a2de::Line
a2de::Rectangle
a2de::Circle
a2de::Ellipse
a2de::Triangle
a2de::Arc
a2de::Spline
a2de::Sector
a2de::Polygon
但它们可以是指针或引用,因为它们都是从a2de::Shape派生而来的。因此,专业化声明为:
template class QuadTree<a2de::Shape&>;
//...similar for all derived types as references.
template class QuadTree<a2de::Shape*>;
//...similar for all derived types as pointers
我遇到的问题是,当间接(或缺乏间接(未知时,调用类方法的能力,并且由于模板的原因,生成了两组代码:
template<typename T>
bool QuadTree<T>::Add(T& elem) {
//When elem of type T is expecting a pointer here
//-> notation fails to compile where T is a reference i.e.:
//template class QuadTree<a2de::Shape&>
//with "pointer to reference is illegal"
if(elem->Intersects(_bounds) == false) return false;
//...
}
如果我将上面的行更改为使用。(点(表示法:
template<typename T>
bool QuadTree<T>::Add(T& elem) {
//When elem of type T is expecting a reference here
//. (dot) notation fails to compile where T is a pointer i.e.:
//template class QuadTree<a2de::Shape*>
//with "pointer to reference is illegal"
if(elem.Intersects(_bounds) == false) return false;
//...
}
如果我删除了基于引用的类型,转而使用基于指针的类型(包括在四叉树类的声明和使用中(,我会得到错误left of .<function-name> must have class/struct/union
。
如果我删除了基于指针的类型,转而使用基于引用的类型(包括在四叉树类的声明和使用中(,我会再次得到前面提到的reference to pointer is illegal
。
编译器:VS2010-SP1
小型重载函数可用于将引用转换为指针:
template<typename T>
T * ptr(T & obj) { return &obj; } //turn reference into pointer!
template<typename T>
T * ptr(T * obj) { return obj; } //obj is already pointer, return it!
现在不要这样做:
if(elem->Intersects(_bounds) == false) return false;
if(elem.Intersects(_bounds) == false) return false;
这样做:
if( ptr(elem)->Intersects(_bounds) == false) return false;
如果elem
是参考,则将选择第一个过载ptr
,否则将选择第二个。两者都返回pointer,这意味着无论代码中的elem
是什么,表达式ptr(elem)
都将始终是pointer,您可以使用它来调用成员函数,如上所示。
由于ptr(elem)
是指针,这意味着检查nullptr
是个好主意:
if( ptr(elem) && (ptr(elem)->Intersects(_bounds) == false)) return false;
相关文章:
- C++取消引用指针.为什么会发生变化
- 深层复制具有自引用指针的类
- Visual c ++,使用字符串引用/指针调用 dll 函数
- std::unordered_map::提取引用/指针失效
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 如何在 c++ 中使用带有数学运算的引用/指针?
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- 取消引用指针并立即为其分配变量,导致分段错误
- 如何获取指向类(而不是对象)的引用/指针
- 将类型参数传递给自引用指针
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 在析构函数内取消引用指针时出现分段错误
- 来自引用指针的内存泄漏
- 引用指针后面的值
- 无法取消引用指针
- 引用指针调用成员函数
- 未定义的引用指针的变量模板在clang中功能,而不是GCC
- 取消引用指针以创建数组的副本
- 有关启动引用指针的引用的问题