【发布时间】:2015-08-07 21:39:07
【问题描述】:
在下面的代码中(C++14,没有来自 C++17 的“折叠”),我试图在编译时使用 boost fusion fold、参数包自动计算类字段的固定偏移量和一个 lambda。不幸的是,这会导致编译时错误......可以做这样的事情吗?
[编辑:其他事情也困扰着我:这不是我想要的。我希望 ControlledLayout2 的 _size 在编译时可用(这就是我将其设为静态的原因),而不仅仅是在调用构造函数时]
template <typename T, uint32_t size>
struct Field2
{
typedef T _type;
static const uint32_t _size;
static uint32_t _offset;
};
template <typename T, uint32_t size>
const uint32_t Field2<T,size>::_size = size;
template <typename T, uint32_t size>
uint32_t Field2<T,size>::_offset = 0;
template <typename ... T>
struct ControlledLayout2
{
static uint32_t _size;
ControlledLayout2(T... args) {
_size = fold({args...}, 0,
[&](uint32_t s, T field) { return T::_offset = s + T::_size; }...);
};
};
...
ControlledLayout2<Field2<int, 32>, Field2<char, 1>, Field2<long, 64>> cl;
cout << cl._size << endl;
...
而编译器错误是:
error: parameter not expanded with '...';
_size = accumulate({args...}, ...
【问题讨论】:
-
错误看起来像 GCC。什么版本?
-
GCC 4.8.3.4 - 当然,有罪的是我的代码,而不是 GCC,对吧?
-
T field->T未展开 -
Piotr - 好的 - 但我很困惑 - 如果我在 T 和字段之间扩展 '...',编译器不会再在这个地方抱怨,但我想要一种类型在 lambda 体内的时间 - 这是它要做什么?
-
那么你应该把
...放在}之后关闭 lambda 表达式(尽管它在 GCC 中失败)
标签: c++ templates boost lambda