2

C++ の関数からを返す方法はありますか? たとえば、次のようなものを使用したいと思います。

// sample pseudo-code: NOT valid C++
template<typename Type1, typename Type2>
type??? getType(bool choice) {
    if(choice == true) {
        return Type1;
    } else {
        return Type2;
    }
}

bool useAwesome = true;

// `Regular` and `Awesome` are classes
getType<Awesome, Regular>(useAwesome) theObject;  

if次の理由により、ステートメントは機能しません。

if(useAwesome) {
    Awesome theObject;
} else {
    Regular theObject;
}
// theObject goes out of scope!

私は「第一級市民」について読んだことがあり、データ型がそうではないことを知っていますが、templateどうにかして助けを借りますか?

4

2 に答える 2

2

実行時にタイプを選択する必要がある場合は、通常、継承を使用します。

class Base {};

class Awesome : public Base;
class Regular : public Base;

Base *ObjectPointer;

if (useAwesome)
    ObjectPointer = new Aweseome;
else
    ObjectPointer = new Regular;

Base &theObject = *ObjectPointer;

を使い終わったらtheObject、必ずdelete ObjectPointer;(またはdelete &theObject;) を実行してください。

これで多くのことを達成するには、通常、または共通の基本クラスを介して、Regularまたはの機能を使用する共通のインターフェイスを定義する必要があることに注意してください。Awesome通常、これを行うには、基本クラスで (多くの場合純粋な) 仮想関数を宣言し、派生クラスでそれらの関数を実装します。少なくとも、基底クラスでデストラクタ virtual を宣言する必要があります (そうしないと、基底へのポインタを介してオブジェクトを削除しようとすると、未定義の動作が発生します)。

于 2012-12-08T12:31:51.087 に答える
1

いいえ、そんなことはできません。C++ の型は、実行時ではなく、コンパイル時に認識されている必要があります。typeid関数から戻ることはできますが、それを使用しtypeidて対応する型の変数を宣言することはできません。

于 2012-12-08T12:29:35.593 に答える