[解決済み] C++で自律的なメンバ型 `self` を実装することはできますか?
2022-10-26 04:14:08
質問
C++
欠如
に相当する
PHP の
self
キーワード
で、これは囲むクラスの型として評価されます。
クラス単位でごまかすのは簡単ですが
struct Foo
{
typedef Foo self;
};
と書く必要があったのですが
Foo
をもう一度。いつかこれを間違えてサイレントバグを起こすかもしれませんね。
をいくつか組み合わせて使うことはできますか?
decltype
と友達を組み合わせて、これを自律的に動作させることはできますか?
すでに以下を試してみました。
しかし
this
はその場所では有効ではありません。
struct Foo
{
typedef decltype(*this) self;
};
// main.cpp:3:22: error: invalid use of 'this' at top level
// typedef decltype(*this) self;
(に相当する部分については気にしないことにします)。
static
と同じことをしますが、レイトバインディングです)。
どのように解決するのですか?
Fooの型を繰り返さずに行う方法を紹介します。
template <typename...Ts>
class Self;
template <typename X, typename...Ts>
class Self<X,Ts...> : public Ts...
{
protected:
typedef X self;
};
#define WITH_SELF(X) X : public Self<X>
#define WITH_SELF_DERIVED(X,...) X : public Self<X,__VA_ARGS__>
class WITH_SELF(Foo)
{
void test()
{
self foo;
}
};
から派生させたい場合は
Foo
から派生させたい場合は、マクロ
WITH_SELF_DERIVED
を次のように使用します。
class WITH_SELF_DERIVED(Bar,Foo)
{
/* ... */
};
可変長テンプレートと可変長マクロのおかげで、好きなだけ多くのベースクラスで多重継承を行うこともできます。
class WITH_SELF(Foo2)
{
/* ... */
};
class WITH_SELF_DERIVED(Bar2,Foo,Foo2)
{
/* ... */
};
gcc 4.8とclang 3.4で動作することを確認しています。
関連
-
[解決済み] エラー: '...'のメンバー '...'が非クラス型である場合のリクエスト
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] 型名の後の括弧は、newで違いがあるのでしょうか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】ローカル変数のメモリはスコープ外からアクセスできる?
-
[解決済み】標準C++で変数の型を表示することは可能ですか?
-
[解決済み】メンバ関数でスレッドを開始する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++