带有可选成员的POD Template类

时间:2012-08-12 20:22:12

标签: c++ templates pod

我正在寻找一种方法来选择性地包含c ++类的成员来生成POD结构。我发现这种方法效果很好,但不标准:

#include <iostream>

template <int v, int n, int t>
struct Point
{
    int vertex[v];
    float normal[n];
    double texcoord[t];
};

int main()
{
    std::cout << (sizeof (Point<0,0,1>)) << std::endl;
    std::cout << (sizeof (Point<1,0,1>)) << std::endl;
    std::cout << (sizeof (Point<1,1,2>)) << std::endl;
    std::cout << (sizeof (Point<0,0,0>)) << std::endl;
    return 0;
}

So Point&lt; 1,0,0&gt;只包含一个顶点(实际上int类型实际上是一个vector3类型),依此类推。主要原因是为OpenGL轻松支持交错数组。

3 个答案:

答案 0 :(得分:4)

也许尝试这样的事情:

#include <type_traits>

template <unsigned int v, unsigned int n, unsigned int t>
struct Point
{
    int data[v + n + t];

    template <unsigned int i>
    typename std::enable_if<(i < v), int &>::type
    vertex() { return data[i]; }

    template <unsigned int i>
    typename std::enable_if<(i < v + n), int &>::type
    normal() { return data[v + i]; }

    template <unsigned int i>
    typename std::enable_if<(i < v + n + t), int &>::type
    texcoord() { return data[v + n + i]; }
};

用法:

Point<1,1,2> p;
p.vertex<0>() = 50;

答案 1 :(得分:2)

std::array<T, 0>有效,与T[0]不同,实际上是一个更好的解决方案。不幸的是,由于这只适用于C ++ 11,我无法弄清楚其Boost同名boost::array是否也有此类支持。

也可以自己写一个array - 像帮手一样。

答案 2 :(得分:0)

你可以这样做,但你需要专业化。

编辑:符合每个阵列不同类型的新问题要求。但是,模板参数是无符号的。

template <> struct Point<0, 0, 0> {};
template <unsigned v> struct Point<v, 0, 0> { int vertex[v]; };
template <unsigned n> struct Point<0, n, 0> { float normal[n]; };
template <unsigned t> struct Point<0, 0, t> { double texcoord[t]; };
template <unsigned v, unsigned n> struct Point<v, n, 0> {
    int vertex[v];
    float normal[n];
};
template <unsigned v, unsigned t> struct Point<v, 0, t> {
    int vertex[v];
    double texcoord[t];
};
template <unsigned n, unsigned t> struct Point<0, n, t> {
    float normal[n];
    double texcoord[t];
};

当相应的模板参数具有值0时,每个特化都会遗漏关联的数组。对于如图所示的三个项目,特化的枚举不是太大,并且提供与原始帖子访问元素完全相同的语法,但使用标准C ++构造。

将此技术扩展到3个阵列以外会很麻烦。但是,可以使用脚本管理它以为您生成特化。