1

オプションで 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;
}

したがって、 Point<1,0,0> には頂点のみが含まれます (int 型は実際には vector3 型になります)、などです。これの主な理由は、OpenGL のインターリーブ配列を簡単にサポートするためです。

4

3 に答える 3

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;
于 2012-08-12T20:30:44.017 に答える
3

std::array<T, 0>とは異なり、有効でT[0]あり、実際にはすべての点で優れたソリューションです。残念ながら、これは C++11 でしか利用できないため、Boost の名前boost::arrayにもそのようなサポートがあるかどうかはわかりません。

arrayのようなヘルパーを自分で作成することもできます。

于 2012-08-12T21:18:03.703 に答える
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];
};

各特殊化は、対応するテンプレート パラメーターが value である場合、関連付けられた配列を除外します0。示されている 3 つの項目の場合、特殊化の列挙は過度に大きくはなく、元の投稿とまったく同じ要素にアクセスするための構文を提供しますが、標準の C++ 構造を使用します。

この手法を 3 つの配列を超えて拡張するのは面倒です。ただし、特殊化を生成するスクリプトで管理することもできます。

于 2012-08-12T20:33:33.160 に答える