我想做这样的事情:
template <typename T:public Vertex> addTri( T v1, T v2, T v3 )
{
// Take v1.pos, v2.pos, v3.pos and create a geometric repn..
Triangle tri( v1.pos, v2.pos, v3.pos ) ; // all vertices will
// have to have a .pos member.
// Create the vertex buffer..
VertexBuffer<T> vb ...
}
因为那行不通,这是我的解决方法..
template <typename T> addTri( T v1, T v2, T v3 )
{
Vertex* p1 = (Vertex*)&v1 ;
// This is a very "shut up C++, I know what I'm doing" type cast.
// I'd like for C++ to know that all vertex types (T in this case)
// __will__ have a Vector member .pos.
Triangle tri( p1->pos, p2->pos, p3->pos ) ;
// Create the vertex buffer..
VertexBuffer<T> vb ...
}
背景
如果您有兴趣,我正在尝试编写一些通用代码来处理三角形创建。
每个顶点必须有一个 .pos
成员,因为每个顶点都必须在空间中有一个位置。
然而,并不是每个顶点类型都有纹理坐标。并非每个顶点都有颜色。因此参数化类型。
XNA 中使用了类似的方法 VertexBuffer.SetData<T>
.
最佳答案
您不能在模板类型参数中指定类型限制。但是,通常情况下,您不必这样做。
如果你只是这样做:
template <typename T> addTri( T v1, T v2, T v3 )
{
Vertex &v1r = v1;
// ....
}
如果函数是用 Vertex 的派生实例化的,这将起作用。如果 T &
不能转换为 Vertex &
,它将产生一个(模糊的)错误。
如果您甚至不关心类型是否可转换为 Vertex
,只要它们具有相同的成员,您甚至可以跳过赋值 - C++ 模板参数本质上使用 duck typing 工作;如果你执行 v1.x
,并且 T
包含一个名为 x
的成员,那么它将工作,无论类型 T
实际上可能是。
使用 boost 的 type-traits library 可以更复杂一点和一个 static assertion ;有了这个,您可以开始定义一个断言,使错误更容易理解:
template <typename T> addTri( T v1, T v2, T v3 )
{
BOOST_STATIC_ASSERT_MSG(boost::is_convertible<T&, Vertex&>::value,
"Template argument must be a subclass of Vertex");
Vertex &v1r = v1;
// ....
}
关于c++ - 模板 <typename T> 中的 T 可以使用继承吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7210944/