如何为模板函数指定可能的数据类型
How to specify possible data types for a template function
我正在尝试创建一个接受两种数据类型的函数,我知道每种数据类型都是drawable
类的后代,这意味着我的函数依赖于drawable
的一些函数。但是,因为它是一个模板函数,所以我不能这样做。
如何使用这些子类函数?还是让它只接受drawable
的后代
这是我职能的开始。GetPositionY是可绘制的函数。
template<typename T, typename T2>
bool CheckCollision(T* obj1, T2* obj2){
obj1->GetPositionY;
CheckCollision()
函数应要求客户端传递一个提供GetPosition()
方法的对象。这就是在模板中调用obj1->GetPositionX()
时要做的操作。没有理由强迫它传递drawable
对象。
通过组合使用:
boost::来自boost.TypeTraits的is_base_ofhttp://www.boost.org/doc/libs/1_46_1/libs/type_traits/doc/html/boost_typetraits/reference/is_base_of.html
和boost::enable_if
http://www.boost.org/doc/libs/1_46_1/libs/utility/enable_if.html
template<typename T, typename T2>
typename boost::enable_if< boost::is_base_of< Drawable, T1>, bool>::type
CheckCollision(T* obj1, T2* obj2)
{
obj1->GetPositionY(); // ... whatever
}
与C#不同,C#将假设最低的公分母,并需要使用"where"子句来解决此问题,C++采取的路径是在使用特定类型实际调用方法之前不检查模板类型的使用情况。因此,只有提供所需方法的类型才会编译。例如
template<typename T, typename T2>
bool CheckCollision(T* obj1, T2* obj2) {
obj1->GetPositionY;
}
class A
{
public:
int GetPositionY;
A() { };
};
class B
{
public:
B() { };
};
int main(int argc, char* argv[])
{
A a;
B b;
// this compiles just fine
CheckCollision(&a, &a);
// this line will not compile, "error: 'class B' has no member named 'GetPositionY'"
// CheckCollision(&b, &b);
return 0;
}
这里讨论了C#和C++泛型的这种差异。
为drawable
类添加一个特征结构,您可以使用它来测试模板中实例化的类型是否是正确的类型。这看起来像
//default for any data-type
template<typename T>
struct drawable_type
{
enum { drawable = 0 };
};
//specialization for a drawable class
template<>
struct drawable_type<drawable>
{
enum { drawable = 1 };
};
template<typename T, typename T2>
bool CheckCollision(T* obj1, T2* obj2)
{
if (drawable_type<T>::drawable && drawable_type<T2>::drawable)
{
//do something
}
else
return false;
}
现在,如果过去的类型不可绘制,您的函数将简单地返回false,否则您可以继续测试,看看是否发生了冲突。
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 具有多个模板的模板函数,用于特定数据类型(如字符串)?
- 从模板创建通用打印函数,以打印基元数据类型变量的值
- C++中是否有用于长数据类型的 lower_bound() 函数?
- 重载具有 2 个相同数据类型成员的构造函数
- 如何使虚函数接受仅在派生类中定义的数据类型?
- 参数数据类型未知的可变参数函数
- 函数重载并根据相同的输入返回不同的数据类型
- 从 cpp lib 调用函数时的数据类型转换
- 有没有办法在函数 c++ 中输入任何数据类型?
- 返回time()库函数的数据类型
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- 使用函数数据类型键入别名和别名模板
- 如何在派生类上强制实现特定数据类型的构造函数?
- 可以比较不同数据类型 c++ 的模板函数
- C 通用函数以除以任何数据类型
- 创建一个模板函数来读取 hdf5 中的任意数据类型
- 将 PIMPL 习惯用法与成员函数模板一起使用(无需预先了解所有可能的数据类型)
- 模板参数在具有相同数据类型的单个类型名的构造函数中不起作用