簡體   English   中英

具有可選成員的 POD 模板類

[英]POD Template class with optional members

我正在尋找一種方法來選擇性地包含 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 的交錯數組。

也許嘗試這樣的事情:

#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;

std::array<T, 0>是有效的,不像T[0]並且確實是一個更好的解決方案。 不幸的是,由於這僅適用於 C++11,我不知道它的 Boost 同名boost::array是否也有這樣的支持。

也可以自己編寫一個類似array的助手。

你可以做到這一點,但你需要專業化。

編輯:匹配每個數組不同類型的新問題要求。 雖然使模板參數無符號。

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 個陣列之外會很麻煩。 但是,可以使用腳本對其進行管理,為您生成專業化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM