好的,假设我有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
)?
答案 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
构造函数但它仍然很棒。
感谢您的评论....他们确实帮我找到了这个方法