【问题标题】:How to convert a struct into a template parameter pack?如何将结构转换为模板参数包?
【发布时间】:2016-06-04 11:20:58
【问题描述】:

好吧,假设我有一个像这样的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{
};

所以我在这条兔子路线上的原因是我可以使用类 Example 并提供一个模板化构造函数,该构造函数将获取 uint8_ts 的列表,然后以这种方式初始化自身(因此仍然是 constexpr 并有效地允许我直接传入)。

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

【问题讨论】:

  • 改用ffi 之类的有什么顾虑吗?
  • @user430051 我不明白这有什么帮助......你能启发我吗?
  • 模板 ,其中 *f 是指向函数的指针。
  • @user430051 其实我已经做了一些实验
  • @DarthRubik 也许这会有所帮助:stackoverflow.com/questions/15896579/…

标签: c++ templates design-patterns


【解决方案1】:

这是我最终做的事情:

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 构造函数的类型
  • 初始化可能很麻烦

但它仍然很棒。

感谢cmets....他们确实帮我找到了这个方法

【讨论】:

    猜你喜欢
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    相关资源
    最近更新 更多