-4

良い一日、

変数を使用してその名前を格納することにより、関数内の構造を参照したいと思います。C++でこのようなことをすることは可能ですか?

確かに、すべての既存の構造は、呼び出しが行われる前に (おそらくグローバルとして) 宣言および初期化され、既存の構造のみが参照されるようにチェックを組み込みます。

この精神で何かしたい:

struct StructName
{
...stuff
}a,b,c;

StructName a;
StructName b;
.
.
.

必要な値の設定を含む (初期化中または必要に応じてコード内の他の場所で)

そして、コードの別の部分から呼び出すには、次のようなものがあります。

void myFunction(char someInput)
{
some stuff
some stuff
externalFunction(static parameter, static parameter, _someInput_, static parameter);
yet some other stuff
}

ここで、somInput は a、b、または c のいずれかです。

私は C の初心者であり、主題に関する正式なトレーニングはほとんどまたはまったく受けていないことを覚えておいてください。

ありがとうございました。

編集:それが私だけの場合、someInputのケーススイッチで、それぞれのケースで構造を直接参照することで間に合わせますが、コードのこの部分は、構造自体を提供する非プログラマーによって拡張可能であることを意図しています。彼に構造初期化コードのテンプレートを提供すると、彼はコード内の指定された場所に初期化コードを追加し、許可された名前のリストを修正し、ライブラリをコンパイルします。

4

2 に答える 2

1

charaまたは a char const *(実行時データ) を型 (コンパイル時情報) に変換することはできません。

[編集]実際には、次のコードのようなものを使用できますが、テンプレートを使用しているため、コンパイル時にしか使用できないため、たとえば関数パラメーターを渡すことはできません。

template < char C >
struct GetType;

template < >
struct GetType< 'a' > {
    typedef struct { int foo; } type; };

template < >
struct GetType< 'b' > {
    typedef struct { int bar; } type; };

GetType< 'a' >::type foo;
GetType< 'b' >::type bar;
于 2013-03-02T22:04:35.707 に答える
0

disappearCおよびC++でのコンパイル手順の一部としての変数名。

通常、説明している問題のタイプを解決する2つのシナリオがあります。

  1. ユーザー入力は特定の変数名に対応します。
  2. 変数の「名前」は実際には必要ありませんが、コードのさまざまな部分にさまざまなデータを関連付ける方法が必要です。

2番目のより単純なケースでは、配列を使用し、正しいデータを関連付ける方法として、必要な要素へのインデックスを使用します。

最初のケースでは、を使用できますstd::map<std::string, structname&>。は配列のstd::mapように機能しますが、テンプレートパラメータを指定する最初のタイプによってインデックスが付けられます。std::mapこの場合、std::stringインデックスとして使用できます。

このようなもの:

#include <map>
#include <iostream>
#include <string>

struct StructName
{
    int x;
};

std::map<std::string, StructName *> vars;

StructName a;
StructName b;

void registerVars()
{
    vars["a"] = &a;
    vars["b"] = &b;
}


int main()
{
    std::string v;

    registerVars();

    while(std::cin >> v)
    {
    std::cin.ignore(1000, '\n');

    if (vars.find(v) == vars.end())
    {
        std::cout << "No such variable" << std::endl;
    }
    else
    {
        vars[v]->x++;
        std::cout << "variable " << v << " is " << vars[v]->x << std::endl;
    }
    }
    return 0;
}
于 2013-03-02T22:51:05.480 に答える