c++ - 模板 <typename T> 中的 T 可以使用继承吗?

标签 c++ templates inheritance

我想做这样的事情:

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/

相关文章:

java - 扩展抽象类的奇怪行为(练习)

c++ - 为什么编译器不会停止在此模板代码上出错

c++ - 接受无限相同数量的 3 种类型的函数

C++ 试图重新分配对实例对象的引用

c++ - 将 lambda 传递给可变参数 std::function 时的类型推导

c++ - 派生类构造函数中的异常

c++ - 了解 std::atomic 内存屏障

C++11 函数参数

c++ - 如何检查 C++ 编译时是否存在运算符的特定重载?

wpf - 在 WPF 中,您可以像使用 Style 一样将一个 DataTemplate 基于另一个 DataTemplate 吗?