2017-08-23 2 views
0

構造体をパラメータとする関数を使用しようとしています。リストの長さがパラメータとしてのC++構造体

この例では、構造体は固定サイズのリスト/ベクター(どちらが正しいかわかりません)を定義しています。

using namespace std 

struct sample { 
    float d[64]; 
}; 

int main(int argc, char* argv[]) { 

    // Some stuff is made 

    vector<sample> result; 
    vector<double> ts; 
    if (double timest = the_function(result, ts)){ 
     cout << timest << endl; 
    } 
return 0; 
} 

しかし、私は選ぶことができ、リストのサイズNと同じ機能を使用します。

私は私がサイズを選択できるようにするために、構造体にパラメータを追加しようとしました:、私は例のように、それを使用

template <int T> 
struct channels { 
    float d[T]; 
}; 

をし、それを使用する:

const int n = function_count(); 
// function_count is a function from a class that return an int 
vector<channels<n> > result; 
vector<double> ts; 

しかし、私
エラー: 'n'の値は定数式では使用できません

私は

const int n = 64; 

を使用しようとしました、それが働いていたので、私はfunction_countが違いを作ると思いますが、function_countはちょうどint型を返します。

他の種類の構造体を使用する必要がありますか?関数で定義されたパラメータで使用できる構造体を作成するにはどうすればよいですか?

EDIT

は、私は、これらの二つの機能を作っていなかったので、function_countthe_functionを変更せずに解決策を見つけたいです。

私はコンパイルの作品、resultを宣言するだけで、ベクターを使用しようとしましたが、それはそれを使用しようとすると、私はエラーを持っている:std::vectorGot an exception: An argument was incorrectly specified.

+1

なぜ 'std :: vector'を使うのではなく、独自の奇妙なテンプレートコンテナクラスを定義していますか? – tadman

+0

短いテンプレートではコンパイル時に機能し、 'function_count'は実行時に実行されます。 'function_count'を' constexpr'してみるか、 'int T'を' std :: vector'のような実行時変数にしてみてください。 – nwp

答えて

3

サイズが自動調整可能つまりそのサイズが増加することができていますか必要に応じて減少する。そのため、適切な型のベクトルを作成してください。

  • ます。また、初期サイズが設定されたベクトルを作成することができますstd::vector

の要素の使用機能void pop_back();を削除するstd::vector

  • の要素の使用機能void push_back (const value_type& val);を追加します。たとえば、次は5にベクトルvecのサイズを設定します。

    std::vector<float> vec(5); 
    

    あなたはget more information about vector here

  • +0

    'std :: vector vec(4)'を実行するときに、 'vec.size()== 5 'を実行してもよろしいですか? –

    +1

    @AlexisWilkeこれは誤植でした。今修正されました。あなたの注意をお寄せいただきありがとうございます。 – cse

    +0

    'std :: vector'を使いたい場合、_result_を' vector > result'と宣言する必要がありますか?そして、「第2の」ベクトルのlenが5であるとはどうして言えますか? – Cataboum

    0

    constconstexprは異なっていることができます。

    テンプレート引数は定数式が必要ですので、あなたのような何かにあなたのコードを変更する必要があります:function_countconstexprことができない場合、あなたはまた、例えば、動的であることをstruct channelsを変更する必要が

    constexpr int function_count() { return 64; } 
    
    void foo() 
    { 
        // ... 
        constexpr int n = function_count(); 
        std::vector<channels<n> > result; 
        // ... 
    } 
    

    struct channels { 
        std::vector<float> d; 
    }; 
    
    関連する問題