这有点难以用语言描述,我将从一个片段开始并尝试尽可能地解释尝试的内容。
struct NonTrivialBase {
virtual void TakeAction();
virtual ~NonTrivialBase();
};
template< typename P >
struct NonTrivial_D1 : NonTrivialBase
{
P case1;
virtual void TakeAction() {
// do something with case1
}
NonTrivial_D1( P arg ) : case1(arg) {
}
};
template< typename Q >
struct NonTrivial_D2 : NonTrivialBase
{
Q case2;
virtual void TakeAction() {
// do something with case2
}
NonTrivial_D2( Q arg, int arg2 ) : case2(arg,arg2) {
}
};
class Unit
{
NonTrivialBase * Member;
public:
template< typename P2 >
Unit (P2 par) : Member ( new NonTrivial_D1<P2>(par) ) {}
template< typename Q2 >
Unit (Q2 par, int par2) : Member ( new NonTrivial_D2<Q2>(par,par2) ) {}
};
template< unsigned short Count >
class Collection
{
Unit units[ Count ];
public:
template< typename P3 >
Collection( P3 par )
// : units { [ 0 ... Count - 1 ] = {par} }
// ^^ problem
{}
template< typename Q3 >
Collection( Q3 par, int arg )
// : units { [ 0 ... Count - 1 ] = {par, arg} }
// ^^ problem
{}
};
如果它不清楚(可能不是)我试图想出一个容器类,它可以初始化一组非平凡构造的对象,所有这些对象都具有相同的参数任何构造函数被认为有效。设计的本质是Collection
和Unit
具有相同的构造函数,以便管理编译时已知数量的相同构造的&#34;单元&#34;只能通过Collection
个引用。
由于各种原因,如果没有构造函数,则无法初始化Unit
。 Collection
和Unit
类都本身就是基类。
我希望像this这样的东西可以工作但是我的环境中没有std::array
(GCC 4.8.1-4 / MinGW),我想避免在可能的情况下包括其他库只是这一件事。例如,Boost对我来说不是一个选择。
然后,array-initializer语法本身。
我知道这只是GCC,但这不是问题。当数组元素类型需要构造函数的模板参数时,我甚至无法使语法正常运行(自动确定与否,我可以使用它们)。我收到的错误相当于:
error: expected identifier before numeric constant
: units { [ 0 ... Count - 1 ] = {par} }
^
我认为应该支持数组范围初始值设定项,this reference提供。
最后我需要明确的是,由于Count
Unit units[Count] = { {param}, {param}, ... }
,例如建议的here。
在宏伟的计划中,我不必这样做,但现在我已经有了这个想法,我真的很好奇如何处理这个问题。
相关的GCC参数(以防万一) - g++ -std=gnu++0x -O3 -Wall -Wconversion -c -fmessage-length=0
修改
澄清一些要求 -
堆与堆栈 - 首选是堆栈,但我可以使用基于堆的解决方案。请记住,单位可能无法复制。
std::array
- 我不能用这个。建议的重复依赖这是可用的。