13

typedefは新しいタイプではなく、C ++のエイリアスに似ていることをご存知かもしれませんが、詳細は次のとおりです。http: //dlang.org/cpptod.html#typedefs
リンクで提案されているソリューションは本当に気に入らないので、疑問に思います。より良い方法はありますか?

4

5 に答える 5

7

C++ で新しい型を導入するには、クラス キーワード ( union/ struct/ class/ enum...) を使用する方法が 1 つしかありません。このようなものをマクロの背後に隠し、これらの新しい型を古い型と同じように直観的に使用できるようにする方法はありますが (「参考文献」を参照BOOST_STRONG_TYPEDEF)、この新しい型を導入する唯一の方法であるという事実は変わりません。

強力な typedef を作成するnewtypeキーワードがあるとします。

newtype foo = int; // with 'using' alias syntax

その型との間の変換はどのように機能しますか? 変換がなければ、新しい型のオブジェクトに値を割り当てることはできません。明示的な変換だけが直感的に見えるかもしれませんが、暗黙的な変換が本当に必要で、それでもオーバーロードできる場合はどうでしょうか? まあ、運が悪い。あらゆる種類の構文を追加して、決定をユーザーに委ねることができるかもしれませんが、新しい構文が必要になるコーナーケースをいつでも思いつくことができると確信しています。それをstructにして、マクロの後ろに隠して、それで終わりです。

于 2012-09-20T19:42:14.440 に答える
1

BOOST_STRONG_TYPEDEFC++ で「strongdef」を作成するために使用します。そのための組み込みの言語機能はありません。

typedefつまり、解決しようとしている実際の問題を知ることは興味深いでしょう。なぜなら、私が取り組んできたコード全体で非エイリアスの必要性が非常に最小限であることがわかったからです。

于 2012-09-20T21:02:49.883 に答える
0

C++ の新しい型は、何らかの方法でサブタイプを集約することによってのみ作成できます。ただし、関数のオーバーロードは静的型に基づいているため、すべての操作と関数を再宣言する必要があります。

C++typedefは D に似aliasています。

開始型がクラスまたは構造体の場合、継承が何らかの形で役立ちます (少なくとも操作は古いパラメーターと同じように機能します) が、すべては戻り値の型に関するものであり、変換を適切に再定義する必要があります。ニュータイプのメリット。

于 2012-09-20T19:44:30.283 に答える
0

C++ で型チェックを実行する方法は多数あります。次のコードを考えてみましょう。基本的な考え方はリンクに示されている例と同じですが、より簡単だと思います。

struct Handle2 {void * ptr;} ;
void bar(Handle2) {}
void foo(void *) {}

int main() {
    Handle2 h2 = {(void*)-1};
    foo(h2); //! won't pass through compiling
    bar(h2);
}
于 2013-04-30T21:47:08.320 に答える