2016-11-24 10 views
1

私はEntity Component Systemで作業していて、Componentクラス自体から派生するクラスの数に基づいてComponentタイプ番号を作成しようとしています。Constexprとknow how countクラス

しかし、私はC++に欠けている機能がいくつかあると思います。 コンポーネントクラスの数は、ベクトル、ビットマスクなどの区切りに使用する必要があるconstexpr整数である必要があります。 今のところ、すべての派生クラスに固有の型番号がありますが、 bitsetは派生クラスの数です。

ベース:派生

//! 
    //! \class ComponentBase 
    //! \brief Exist only to manage CounterType in a prepocessor way 
    //! 
    class ComponentBase { 


    protected: 
     static uint32_t CounterType; // Counter of actual component number 

    public: 
     virtual ~ComponentBase() {} 
    }; 
} 

typedef std::bitset<ComponentBase::CounterType> T_Mask; 

//! 
    //! \class Component 
    //! \brief Superclass for Component, stock Type number and Manager 
    //! 
    template < typename Derived > 
    class Component : public ComponentBase { 

    public: 
     static const uint32_t    Type; 

    protected: 
     Component() = default; 
    }; 
} 

    template < typename Derived > 
    const uint32_t Component<Derived>::Type = ++ComponentBase::CounterType; 

しかし、今、私はビットセットのサイズを設定するCounterTypeを使用することはできません。 constexprを試しましたが、成功しませんでした。

あなたはいくつかのアイデアがあるなら、私はすべての耳です。 おかげでとにかく

シモンズ:私は(今のG ++ 6-2)任意のC++制限はありません

+3

真剣に、コメントが多すぎるようなことがあります。特に言語機能のために... – StoryTeller

+0

申し訳ありませんが、コードを削除しましたがコメントを忘れてしまった!ありがとう –

+1

あなたの質問に答えるために、私はあなたができるとは思わない。派生クラスの数はバインドされておらず、すべての翻訳単位がコンパイルされている場合は常に利用可能であるとは限りません。 – StoryTeller

答えて

1

あなたが求めていることは、C++では不可能です。

基地を想定し、派生は、あなたのプロジェクトに次のファイルを持っているheader.hpp経由(推移的でインクルード)利用可能であり、正当なC++

です:

1.cpp

#include "header.hpp" 
class One {}; 

class ComponentOne : public Component<One> {}; 

2.cpp

#include "header.hpp" 
class Two {}; 

class ComponentOne : public Component<Two> {}; 

あなたはスピンアップcc.e 1.cppを1.oにコンパイルするためのxeと、2.cppを2.oにコンパイルするもう一つのインスタンスはどうなりますか?

+0

あなたはそうですが、C++はコード全体を一度に見ていないので、不可能です。ありがとう:) –

0

申し訳ありませんが、ヨーヨーを決定する必要があります。

  1. std::bitset<size_t N>た(constが必要ですexpr)はあなたが

    static const uint32_t CounterType = 1; // Counter of actual component number 
    
  2. しかし、この場合はを持っていることによって、これをNための番号(何かを)修正することができます:定数変数をインクリメントしようとすると、3210は機能しません。

は私がそう多くの問題を明確に識別するために、私たちとのシーン情報の背後に多くを共有してください、あなたのデザインと怪しいものがある気がします。

+0

詳細編集。 –

関連する問題