0

タイトルが言うように、次のようなことを行う方法はありますか:

typedef vector<int> ListInt;
string ListInt::GetSomeValue() { //Add method to 'ListInt'
    return "value";
}
int ListInt::SomeField; //Add field\variable to 'ListInt'

継承などなし(コンパイル時間短縮のため)

短いメッセージで申し訳ありませんが、それで十分だと思います。

4

3 に答える 3

2

これは、 Uniform Function Call Syntaxまたは実行時の型変更のいずれかを使用することを認識している言語で解決さ​​れます。それらのどれも C++ でサポートされていないので、いいえ、ここでは選択肢がないと思います。継承やフリー関数、カプセル化型など、「近い」ソリューションはたくさんありますが、あなたが要求したものとまったく同じものはありません。

于 2012-08-18T20:39:07.927 に答える
2
//ListInt.h
struct ListInt {
    vector<int> *operator->( );
    vector<int> *operator*( );
    int SomeField;
    string GetSomeValue( );
private:
    vector<int> internalvalue;
};

//ListInt.cpp
vector<int> *ListInt::operator->( ) {
    return &internalvalue;
}
vector<int> *ListInt::operator*( ) {
    return &internalvalue;
}
string ListInt::GetSomeValue( ) {
    return "value";
}

asへのアドレスと as へのSomeFieldアドレス。例:ListInt::SomeFieldGetSomeValueListInt::GetSomeValue

ListInt listInt;
listInt.SomeField = 3;
listInt.GetSomeValue( ); //Returns 'value'
listInt->push_back(2); //Use `vector<int>`'s fields.
于 2012-08-18T20:48:54.847 に答える
1

'typedef'で定義された型にフィールド/メソッドを追加する方法はありますか?

最初に答える必要があるのは、typedef実際の意味です。Aは既存のタイプのエイリアスtypedefを作成しますが、新しいタイプは作成しません。新しい名前の後は、元の名前とまったく同じタイプを参照し、ほとんどのコンテキストで両方の名前を同じ意味で使用できます*typedef

typedefそれが明確になると、答えは明白に見えます。エイリアスは他のタイプを正確に参照しているため、エイリアスに機能を追加したり、エイリアスから機能を削除したりすることはできません。2つのタイプはなく、1つだけです。オリジナルです。


*元のタイプと、aを介して作成されたエイリアスは、typedefほとんど違いはありませんが、100%同等ではありません。特に、元のタイプの名前(ユーザー定義であると想定)は、関数、変数、またはエイリアスstd::vector<X>とは異なる識別子スペースにあります。typedef名前は型のtypedef名前ではなく、型のエイリアスです。次のコードは、違いの1つを示しています。

struct A {};
typedef A B;
struct A a;      // creates a variable `a` of type `A`
//struct B b;    // error, `B` is a typedef, not a `struct`

最も顕著な違いのいくつかは、複数の翻訳ユニットをコンパイルする場合にのみ明確になります。typedefエイリアスは常に翻訳ユニットの内部にあります。オブジェクトファイルで生成されたシンボルは、を参照しませんtypedef。コンパイラはtypedef実際の型を解決し、すべての記号と名前マングリングは実際の型が使用されたかのように実行されます。

于 2012-08-18T23:49:29.693 に答える