this questionと同じタイトルを意図的に使用しています。私が受け入れる答えが、私が抱いている問題を説明していないと感じているからです。クラスに特定のメンバー変数が実際に存在するかどうかを検出するにはどうすればよいですか?
いくつかのクラスにいくつかのメンバーがあるかどうかを検出する方法を探しています変数です。私が変数を探していますが、それはメンバー関数ではなく、他のものではありません。ここで
は、私がリンクされ、質問に提供された例である。
template<typename T> struct HasX {
struct Fallback { int x; }; // introduce member name "x"
struct Derived : T, Fallback { };
template<typename C, C> struct ChT;
template<typename C> static char (&f(ChT<int Fallback::*, &C::x>*))[1];
template<typename C> static char (&f(...))[2];
static bool const value = sizeof(f<Derived>(0)) == 2;
};
struct A { int x; };
struct B { int X; };
int main() {
std::cout << HasX<A>::value << std::endl; // 1
std::cout << HasX<B>::value << std::endl; // 0
}
しかし、我々は、我々は
template<typename T> struct HasX {
struct Fallback { int x; }; // introduce member name "x"
struct Derived : T, Fallback { };
template<typename C, C> struct ChT;
template<typename C> static char (&f(ChT<int Fallback::*, &C::x>*))[1];
template<typename C> static char (&f(...))[2];
static bool const value = sizeof(f<Derived>(0)) == 2;
};
struct A {
void x()
{
}
};
struct B { int X; };
int main() {
std::cout << HasX<A>::value << std::endl; // 1
std::cout << HasX<B>::value << std::endl; // 0
}
(ような何かを行う場合は、2番目の例であることに注意してください非常に同じ出力が得られますA
のint x
をメンバ関数void x()
に置き換えました。
この問題を回避するには実際の考え方はありません。
template <bool, typename> class my_helper_class;
template <typename ctype> class my_helper_class <true, ctype>
{
static bool const value = std :: is_member_object_pointer <decltype(&ctype :: x)> :: value;
};
template <typename ctype> class my_helper_class <false, ctype>
{
static bool const value = false;
};
template <typename T> struct HasX
{
// ...
static bool const value = my_helper_class <sizeof(f <Derived>(0)) == 2, T> :: value;
};
実際に私がオブジェクトを使用しているかどうかを選択します。しかし、私のクラスに同じ名前のx
というオーバーロードされた関数があると、上記は機能しません。私は
struct A
{
void x()
{
}
void x(int)
{
}
};
を行う場合たとえば
はその後ポインタが正常に解決されていないとHasX <A>
への呼び出しはコンパイルされません。
私は何をすべきですか?これを行うための回避策や簡単な方法はありますか?
ブーストでis_functionがあります。あなたはこれを使うことができるかもしれない。 – Ivan