10

ちょっとした質問があります。C++ ポインターの型を調べるにはどうすればよいですか?

私はよくコンソール プログラムで小さな関数を使用して入力を収集します。これは次のようになります。

void query(string what-to-ask, [insert datatype here] * input)

void ポインターを使用してジェネリック フォームを作成したいのですが、void ポインターを作成することはできません。

4

7 に答える 7

12

できません。

ただし、1 つの代替手段は、void ポインターを廃止し、すべてを共通の基本クラスから派生させ、RTTI を使用することです。

例:

class Base
{
public:
   virtual ~Base() {}
};

class Foo : public Base { /* ... */ };

void SomeFunction(Base *obj)
{
    Foo *p = dynamic_cast<Foo*>(obj);
    if (p)
    {
        // This is of type Foo, do something with it...
    }
}
于 2009-11-11T22:16:37.747 に答える
6

Instead of passing a void* around that you then need to cast to the correct type you should probably use a template function that can be used with all types you want to read.

This way you get type-safe code and don't have to way to write special code for most input types:

template<typename T>
void query(const string &whattoask, T &input) {
  cout << whattoask << endl;
  cin >> input;
  cout << endl;
}

int main() {
  int i;
  double d;
  string s;

  query("An integer: ", i);
  query("Floating point: ", d);
  query("A word: ", s);
}
于 2009-11-11T22:30:50.077 に答える
2

void*すべてのデータが持つ形式です。それを「決定」することはできません-それ、プログラム内のデータはすべてです void*! はい、設計上、それらはメモリの生のチャンクです。

onlyを使用してコード全体をプログラムできますvoid*。幸いなことに、C 言語はさらに利便性を提供し、一部のデータをそのまま操作できるようにしますvoid*void*ただし、この便利さを使用する場合は、それらをにキャストして、それらがどのタイプであったかを忘れるべきではありません。

于 2009-11-11T22:18:46.447 に答える
2

あなたの質問は私にはまったく明確ではありませんが、おそらくあなたが望むのはオーバーロードすることですquery

void query(string what2ask, int* input) {
   cout << what2ask;
   cin >> *input;
}


void query(string what2ask, float* input) {
   cout << what2ask;
   cin >> *input;
}

int age;
float sqrt2;
query("How old are you?", &age);
query("What's the square root of 2?", &sqrt2);
于 2009-11-11T22:20:10.927 に答える
1

自分でデータ型を制御する場合は、おそらく、気になるすべてのデータ型の列挙型を含むクラス/構造体を作成して渡すでしょう。次に、渡されたポインターのデータ型を照会し、適切にキャストできます。

IE (疑似コード警告 - 今のところこれを構造体として扱います。)

class MyDataType {
     enum aDataType type;
     void * myData;
}

void query( string whatToAsk, MyDataType * pdata)
{
    switch ( pdata.type) {
        case integer:
              int * workInt = (int * )  pdata;
              do whatever you want to to get the data
              break;
        case someFunkyObject:
              someFunkyObject pob = (SomeFunkyObject *) pdata;
              Do whatever you want with the data.

        etc.
    }
}
于 2009-11-11T22:23:38.790 に答える
0

あなたが何を求めているのか理解できれば、これを行う通常の方法は、サポートするインターフェイス クラスを作成query(string what-to-ask)し、void ポインターを使用する代わりにインターフェイスへのポインターを渡すことです。次に、そのインスタンスで query() を呼び出すことができます。

于 2009-11-11T22:16:37.090 に答える
0

いいえ。これはできません。このようなものが必要な場合は、Boost.Anyをお勧めします。

于 2009-11-11T22:17:58.567 に答える