0

非静的クラスメンバーにアクセスするには?

class A
{
    int value_ = 0;//I want to access this member in class inheriting from A
};
template<class X = A>
class Y :X
{
static_assert(value_ == 0,"Non-zero not allowed");//here I want to access value_ from X which is A by default. Is this possible?
};
4

1 に答える 1

2

あなたが具体的に行っていることは、いくつかの理由で不可能です。

まず、static_assert引数がコンパイル時の定数式である必要があります。value_間違いなくそうではありません。

というラベルを付けることで、定数式にすることができますconstexprconstexprただし、C++11 では非静的データ メンバーは許可されません。たとえそうであったとしてもvalue_、非静的メンバーであるため、それは役に立ちません。そのため、まだ存在しません。実際のクラスインスタンス、つまりthisポインターを持つものがある場合にのみ存在します。あなたのstatic_assert式はそれらのオブジェクトのいずれも作成しないため、それにアクセスする方法はありません。

したがって、この「作業」を行うには (「作業」が意味のあることを行う範囲で)、次のことを行う必要があります。

  1. コンストラクAターを指定して、そのインスタンス化をconstexpr作成できるようにします。constexpr
  2. コンストラクターを使用してstatic_assert実際に型を作成constexprし、問題のデータ メンバーにアクセスする必要があります。

さて、これを行うと、あなたが望むものが得られないことがわかりますこのステートメントに基づいて、あなたの質問はあなたが達成しようとしていることを正確に説明していないためです):

第二に、このクラスのオブジェクトが作成されるたびにという意味でした。X はテンプレート パラメータであるため、定数式です。

staticstatic_assertであることに注意してください。「このクラスのオブジェクトが作成されるたび」は実行時イベントです。実行時に発生するものに対して静的テストを実行することはできません。

あなたが望むのは定期的 assertであり、ではありませんstatic_assert

于 2012-10-21T15:11:05.673 に答える