C++11 按对齐方式对模板中的成员重新排序

C++11 按对齐方式对模板中的成员重新排序,c++11,template-meta-programming,C++11,Template Meta Programming,假设我编写了以下代码: template<typename T1, typename T2> struct dummy { T1 first; T2 second; }; 当实例化为dummy时。然而,我想获得 struct dummy { int second; char first; }; 在大多数平台上,std::pair的填充仅在自然对齐时发生。这类填充对于任何一个顺序都是相同的 对于std::tuple,某些安排可能比其他安排更有效,但库可以选择它喜欢的

假设我编写了以下代码:

template<typename T1, typename T2>
struct dummy {
  T1 first;
  T2 second;
};
当实例化为dummy时。然而,我想获得

struct dummy {
  int second;
  char first;
};

在大多数平台上,std::pair的填充仅在自然对齐时发生。这类填充对于任何一个顺序都是相同的

对于std::tuple,某些安排可能比其他安排更有效,但库可以选择它喜欢的任何内存布局,因此您添加到上面的任何TMP都只是事后猜测


一般来说,可以使用模板定义排序算法,但这将是一项相当大的工作。

这是可以做到的,唯一的问题是命名,如何命名字段?? 不久前,我做了您要求的事情,我使用了std::tuple和一些元编程技巧,我做了一个合并排序来重新排序模板参数,如果您喜欢函数编程,这真的很有趣。 对于命名,我使用了一些宏来访问字段


我真的鼓励你自己去做,这在智力上真的很有趣,但是如果你想看一些代码,请告诉我

很抱歉,我在这里使用pair作为示例,因为它似乎暗示我对STL对感兴趣。我对做这件事的一般技术感兴趣。我还知道,如果我把这些放在一个数组中,那么你只会在对之间获得填充,但在一个具有小堆栈的嵌入式环境中,它确实会产生一点小的差异。@JT1请给出一个实际的示例,其中你期望实际的差异。如果你将它扩展到三元组而不是一对,当我查看反汇编时,triple和triple在gcc上的堆栈上生成不同的大小。再一次,我在这里放了一对,因为如果有人想展示它是如何完成的,这将是最简单的例子。@JT1是的,但其中一个将使用std::tuple,而不是triple。真的吗,你想做什么?我只是想知道如何在模板类中通过降低大小来重新排序成员,以保证类实例的最小内存占用。同样,我对STL不感兴趣,所以虽然我知道三元组被称为std::tuple并作为可变模板实现,但它与这个问题无关。如果你还在问,就把整个问题当作一个学术问题。这些问题正好说明了我对什么感兴趣。我将完全删除“为什么”,这样就没有人会问?考虑到您声明变量的顺序与它们的显示顺序相同,您需要创建一个具有所需顺序的构造函数。我假设你想要dummychar first_param,int second_param:firstfirst_param,secondsecond_param{}?
struct dummy {
  int second;
  char first;
};