C++ 在一次过程中定义结构并创建相关数据项的列表?

C++ 在一次过程中定义结构并创建相关数据项的列表?,c++,macros,template-meta-programming,C++,Macros,Template Meta Programming,我想实现一个系统,在这个系统中,我可以使用一组宏(或模板)在单个过程中创建一个结构和一些数据。它的用法如下(语法不是固定的,任何有效的都可以): 并将输出: struct MyVertex { float3 Position; float3 Normal; float2 UVa; float2 UVb; float4 DiffuseColor; }; 而且: 我看不到使用宏或TMP实现这一点(创建两个单独的输出块)的方法-有人知道这是否可行吗?我不能直接

我想实现一个系统,在这个系统中,我可以使用一组宏(或模板)在单个过程中创建一个结构和一些数据。它的用法如下(语法不是固定的,任何有效的都可以):

并将输出:

struct MyVertex
{
    float3 Position;
    float3 Normal;
    float2 UVa;
    float2 UVb;
    float4 DiffuseColor;
};
而且:

我看不到使用宏或TMP实现这一点(创建两个单独的输出块)的方法-有人知道这是否可行吗?我不能直接使用boost,但如果知道它是否能提供解决方案,那将是非常有用的

一种选择是使用包含文件,如下所示:

MyVertex.h包含定义
def_makestruct.h包含用于创建结构的宏
def_makefields.h包含用于创建字段的宏

然后:


所以我至少只需要在一个地方编辑定义,但它必须在它自己的文件中。有更好的方法吗?

我有一个类似的问题,我使用了后续的技术,以避免将同一个字符串写入两次

将文件上使用的宏定义为:

在名为data.cpp的文件中只写入一次所需数据

mcr(NORMAL,3,Normal)
mcr(TEXCOORD,2,UVa)
mcr(TEXCOORD,2,UVb)
mcr(COLOR,4,DiffuseColor)
在另一个文件中写入

#define mcr(a,b,c,etc) define_as_needed
struct MyVertex
{
#include "data.cpp"
}
#undef mcr

#define mcr(a,b,c,etc) define_as_needed
而不是重新定义宏

#define mcr(a,b,c,etc) define_as_needed

field_definition MyVertex_field_defs[] =
{
#include "data.cpp"
};

#undef mcr
在我的例子中,根据每次需要更改宏定义的内容,我将执行上述4次中的3次重新定义

使代码适应您的需要。
特别是对于常量和相关字符串以及结构中的数据的定义,它非常方便。

您试图实现的功能称为

如果不希望在每个扩展站点包含任何文件或提供元素/def_vert/end_vert定义,可以将它们作为额外参数传递给MyVertexDef宏

#define MyVertexDef(def_vert, element, end_def) \
def_vert(MyVertex) \
    element(float, 3, Position, POSITION, 0) \
    element(float, 3, Normal, NORMAL, 0) \
    element(float, 2, UVa, TEXCOORD, 0) \
    element(float, 2, UVb,           TEXCOORD, 1) \
    element(float, 4, DiffuseColor, COLOR, 0) \
end_def()

#define struct_def_vert(name) struct name {
#define struct_end_def() };
#define struct_element(type, size, name, meaning, index) type name; 

#define array_def_vert(name) field_definition name##_field_defs[] = {
#define array_end_def() };
#define array_element(type, size, name, meaning, index) {#name, index, type##_type, size},

#define GenerateStruct(T) T(struct_def_vert, struct_element, struct_end_def)
#define GenerateArray(T) T(array_def_vert, array_element, array_end_def)
...
//Where you want your struct MyVertex
GenerateStruct(MyVertexDef)
...
//Where you want MyVertex_field_defs
GenerateArray(MyVertexDef)

你为什么要那样?你会比以前写更多的代码。@Axalo:对不起,我不明白。我想避免在多个地方编辑定义。对,这类似于问题末尾的选项。但是不使用include可以吗?我了解到,不使用include也可以按照前面答案中描述的方式完成!你真的不应该包含*.cpp文件though@axalo你的确切意思是什么?.cpp文件将被编译并包含头文件。您包含了一个.cpp文件。
#define mcr(a,b,c,etc) define_as_needed
struct MyVertex
{
#include "data.cpp"
}
#undef mcr

#define mcr(a,b,c,etc) define_as_needed
#define mcr(a,b,c,etc) define_as_needed

field_definition MyVertex_field_defs[] =
{
#include "data.cpp"
};

#undef mcr
#define MyVertexDef(def_vert, element, end_def) \
def_vert(MyVertex) \
    element(float, 3, Position, POSITION, 0) \
    element(float, 3, Normal, NORMAL, 0) \
    element(float, 2, UVa, TEXCOORD, 0) \
    element(float, 2, UVb,           TEXCOORD, 1) \
    element(float, 4, DiffuseColor, COLOR, 0) \
end_def()

#define struct_def_vert(name) struct name {
#define struct_end_def() };
#define struct_element(type, size, name, meaning, index) type name; 

#define array_def_vert(name) field_definition name##_field_defs[] = {
#define array_end_def() };
#define array_element(type, size, name, meaning, index) {#name, index, type##_type, size},

#define GenerateStruct(T) T(struct_def_vert, struct_element, struct_end_def)
#define GenerateArray(T) T(array_def_vert, array_element, array_end_def)
...
//Where you want your struct MyVertex
GenerateStruct(MyVertexDef)
...
//Where you want MyVertex_field_defs
GenerateArray(MyVertexDef)