如何将结构转换为模板参数包?

时间:2016-06-02 23:50:05

标签: c++ templates design-patterns

好的,假设我有struct这样:

struct Example{
  uint8_t var0;
  uint32_t var1;
  uint16_t var2;
};

假设我有一个类似实例(注意constexpr):

constexpr Example exp = {10,11,12};

我想以某种方式将其表示为模板参数包。

这样的例子:

typedef SomeTemplate<
        /* first variable: 1 byte */   10,
        /* second variable: 4 bytes */ 11, 0, 0, 0,
        /* third variable: 2 bytes */  12, 0> mydef;

我这样做的膝盖反射是对一些联合做一些模板元编程魔术,但遗憾的是这是不可能的,因为以我想要的方式访问联合是编译时未定义的行为(即错误)。

我所有这一切的最终目标是将用户定义类型的实例作为模板参数....就像这样:

template<Example exp>
class OtherClass{
};

所以我在这条兔子小道上的原因是我可以采用类示例并给出一个模板化的构造函数,它将获取uint8_t的列表,然后以这种方式初始化(​​因此仍然constexpr并有效地允许我直接传递它。

那么有没有办法在编译时将任意结构实例转换为位模式(以及所有constexpr)?

1 个答案:

答案 0 :(得分:0)

以下是我最终做的事情:

template<class T,class... Args_t>
struct Statifier{
    constexpr T operator()() { return T(Args_t()...); }
    constexpr operator T() { return T(Args_t()...); }
};

然后你就这样使用它:

template<class T, T value>
using ic = integral_constant<T,value>;
struct Point{
    int x;
    int y;
    int z;
    constexpr Point(int x,int y,int z) : x(x),y(y),z(z) { }
};
typedef Statifier<Point,ic<int,12>,ic<int,12>,ic<int,12> > triple;

triple现在是一个类型,可以传递给模板参数。

这种方法的局限性:

  • 您只能使用可由其构造函数区分的类型
  • 您必须使用具有constexpr构造函数
  • 的类型
  • 初始化
  • 可能很麻烦

但它仍然很棒。

感谢您的评论....他们确实帮我找到了这个方法