gpt4 book ai didi

c++ - 包装类的静态初始化列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:57:51 25 4
gpt4 key购买 nike

是否有可能在构造时以某种方式将静态初始化列表“传递”给容器包装类,然后再初始化其成员?

struct bar {
bar(void * ptr): ptr(ptr) {}
void * ptr;
};

template<class T, int N>
struct foo
{
foo( args ) :store(args) {} // here the arg list should be passed

T store[N];
};

int main()
{
bar b[2]={NULL,NULL};
foo<bar,2> f(NULL,NULL); // This should be possible
}

很遗憾,我无法使用 STL 或 Boost。

如果您怀疑它的用处,让我来解释一下。首先,这是一个非常“成熟”的设置。解释整个设置不足以在此处发布,也无济于事。试想一下,您有一个嵌套的表达式模板树,您在编译时遍历它并收集涉及的对象并将它们存储在容器包装器中,如上所示。如果您还有其他问题,请提出。

已编辑:应该调用 T 的默认构造函数。

最佳答案

方法一:va_args

如果您同意制作 bar POD,这可以通过 va_args 完成:

#include <stdarg.h>

struct bar {
void * ptr;
};

template<class T, int N>
struct foo
{
foo(...) { // here the arg list should be passed
va_list ap;
va_start(ap, N);

for (int i = 0; i < N; ++i) {
store[i] = va_arg(ap, T);
}
va_end(ap);
}

T store[N];
};

int main()
{
foo<bar,2> f(bar(),bar());
}

虽然它不是很好 - 你必须根据我的喜好过于信任调用者,并且 POD 要求可能非常有限。

方法二:范围

如果您同意让您的类型 T 默认可构造和可赋值,您可以使用此方法:

#include <assert.h>
#include <stdlib.h>

struct bar {
bar(void * ptr): ptr(ptr) {}
bar() {}
void * ptr;
};

template<class T, int N>
struct foo
{
foo(T *begin, const T *end) { // here the arg list should be passed
// Normally I'd use std::copy here!
int i = 0;
while (begin != end) {
assert(i < N);
store[i] = *begin++;
}
}

T store[N];
};

int main()
{
bar b[2]={NULL,NULL};
foo<bar,2> f(&b[0], &b[sizeof(b)/sizeof(bar)]);
}

它不是很无缝 - 您最终会得到一个数组和一个对象实例,但是您可以使数组 static const 并且至少对其余代码保持良好的隐藏状态。

方法三:运算符重载技巧

您还可以使用 operator, 的技巧将所有项目缩减为一个参数,IIRC 类似于 Boost.Assign

关于c++ - 包装类的静态初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7131442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com