C ++包装类,包含非平凡构造对象的原始数组

时间:2016-06-16 14:34:56

标签: c++ arrays oop templates c++11

这有点难以用语言描述,我将从一个片段开始并尝试尽可能地解释尝试的内容。

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
    {}

};

如果它不清楚(可能不是)我试图想出一个容器类,它可以初始化一组非平凡构造的对象,所有这些对象都具有相同的参数任何构造函数被认为有效。设计的本质是CollectionUnit具有相同的构造函数,以便管理编译时已知数量的相同构造的&#34;单元&#34;只能通过Collection个引用。

由于各种原因,如果没有构造函数,则无法初始化UnitCollectionUnit类都本身就是基类。

我希望像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 - 我不能用这个。建议的重复依赖这是可用的。

0 个答案:

没有答案