0

この質問の名前がよくわからないので、間違っている、またはだまされているように聞こえる場合はご容赦ください。私はこれまでに遭遇したことのない問題を抱えています。基本的に、実際の構造体を作成せずに関数に構造体を配置する必要がある場合 (値を使用するだけでよい)、次のようにします。

struct a{
    int x,y,z;
};

void function(a x){ ... }

void main(void){
    function(a(34,64,75));
}

ただし、その構造体内で配列を使用する必要があるため、次のようになります..

struct a{
    int x[5];
};

void function(a x){ ... }

void main(void){
    function(a(????));
}

実際の変数を使用せずに適切に初期化する方法がわかりません。都合が悪いだけなのですが、これの答えが知りたいです。私は自分の道を探してブルートフォースを試みましたが、うまくいきませんでした。

助けてくれてありがとう

編集:私の質問には多くの複雑さがあり、多くの人が私の軽率さに腹を立てています。まず、私は C++ テンプレートについて言及しているのではありませんが、単語の実際の意味については、私の壊れた英語で申し訳ありません..自分自身をよりよく説明しようとしています (TRY): 私がしたいのは、構造体変数を作成する使用法を省略することです特定の関数に対して、最初の例でわかるように、その関数の呼び出しで構造体メンバーを自分で手動で定義します..ただし、2番目の例では、本当に求めているのは、構造体のメンバーを手動で定義する方法だけです。配列になっています。もう一度、この質問を最初に投稿したときのすべての間違いをお詫びします

4

1 に答える 1

1

C++を使っていると思います。あなたの質問を正しく理解できれば、中間変数を使用せずに配列を初期化する必要があります。その場合、適切なコンストラクターを構造体に追加する必要があります。

次のコードはこれを行います。ただし、GCC バージョン (>= 4.6) などの最新のコンパイラが必要であり、g++ -std=c++11 file.cppとしてコンパイルする必要があることに注意してください。

#include <iostream>
#include <initializer_list>
#include <algorithm> 

using namespace std;

struct s{
  int x[5];
  // constructor 1. a variant using 'initializer_list'
  s(initializer_list<int> l) { copy(l.begin(),l.end(),x); } 
  // constructor 2. using a variadic template 
  template<class ...T> s(T... l) : x{l...} {} ;             
  // constructor 3. copy from an existing array 
  s(int* l) { copy(l,l+5,x);}
};

int f(s instance){ return instance.x[2]; }

int main(){
  s a1({1,2,3,4,5});      // calls constructor 1 (or 2 if 1 is left out)
  s a2{1,2,3,4,5};        // calls constructor 1 (or 2 if 1 is left out)
  s b1(1,2,3,4,5);        // calls constructor 2
  int l[5] = {1,2,3,4,5};    
  s c1(l);                // calls constructor 3

  cout << l[2] << endl;
  cout << a.x[2] << endl;
  cout << f(s(l)) << endl;
  cout << f(s{1,2,3,4,5}) << endl;    // calls constructor 1 again (or 2 if 1 is left out)
}
于 2013-10-28T14:27:25.943 に答える