C++ 包装器类的静态初始值设定项列表

C++ 包装器类的静态初始值设定项列表,c++,object-initializers,C++,Object Initializers,是否有可能在构造时以某种方式“传递”静态初始化器列表给容器包装器类,而容器包装器类反过来初始化其成员 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

是否有可能在构造时以某种方式“传递”静态初始化器列表给容器包装器类,而容器包装器类反过来初始化其成员

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
}
结构栏{
条(void*ptr):ptr(ptr){}
无效*ptr;
};
模板
结构foo
{
foo(args):存储(args){}//这里应该传递arg列表
T存储[N];
};
int main()
{
条b[2]={NULL,NULL};
foo f(NULL,NULL);//这应该是可能的
}
不幸的是,我不能使用STL或Boost

如果你怀疑这有什么用,我来解释一下。首先,这是一个非常“成熟”的设置。解释整个设置不足以在这里发布,也没有帮助。想象一下这样一种情况,您有一个嵌套的表达式模板树,在编译时遍历它,收集相关的对象并将它们存储在容器包装器中,如上所述。如果你有进一步的问题,请提问

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

Method 1:va_args 如果您同意制作条形吊舱,可以使用
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());
}
它不是完全无缝的-您最终会得到一个数组和一个对象实例,但是您可以使数组
静态常量
,并至少对其余代码保持良好的隐藏

方法3:运算符重载技巧
您还可以使用带有
运算符的技巧,
将所有项简化为一个参数,IIRC与此类似。

C++0x使此操作变得简单。我将尝试C++98的答案,谢谢!对不起,我不能使用c++0x。他们说的是一个常量数组,但这是同样的潜在问题,我认为你不能/不会通过将
store
设置为指针数组来添加一个间接级别?“很遗憾,我不能使用STL或Boost。”—为什么?这听起来很愚蠢。这就像使用C#而无法使用
字符串
类一样。或者所有的.NET框架,事实上。谢谢!很好的解决方案。不幸的是,两者都有相同的问题:在包装类的构造时调用T的标准构造函数。相反,应该调用一个带参数的构造函数,就像在我的第一个“b”定义的原始代码中一样。我认为如果没有新语法(C++0x)或复制构造它们/从其他地方赋值,这是不可能的。
#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)]);
}