3

メンバー ポインターが指すメンバーの型を抽出したいと思います。

template<someType myClass::*member>
void demo(myClass& instance, void* ptr) {
    instance.*member = *reinterpret_cast<someType*>(ptr);  // can the someType in this line be deduced from member?
}

コメントで提案されているように使用decltypeしてみましたが、これには問題があります。

instance.*member= static_cast<decltype(instance.*member)>((*buffer)[offset]);

bufferstd::shared_ptr<std::vector<uint8_t>>
someTypeですuint32_t

次のエラー メッセージが表示されます。

エラー: タイプ '__gnu_cxx::__alloc_traits >::value_type {aka unsigned char}' からタイプ 'uint32_t& {aka unsigned int&}' への無効な static_cast </p>

私が理解decltype(instance.*member)している限り、 memberdefined asではなく参照uint32_t instance::*memberが生成されます。インスタンスを値で渡そうとしましたが、エラーが残ります。私は知っていますが、そもそも参照がどのようにそこにあるのかわかりません。 uint32_t&uint32_tstd::remove_reference

someTypeクラスインスタンスなしで を抽出できれば、さらに改善されます。ただし、これを達成する方法はわかりませんが、std lib を次のようにすることで、ポインターなしでクラスを取得できます。

template <T*>
struct removePointer {
  typedef T type;
}

someType最初にクラスを知らなくても、クラスの一部を取得できる形式でこれを記述する方法がわかりません。次のように書くこともできますが、クラス名と型名を明示的に渡す必要があります。これらを自動的に抽出する方法はありますか? さらに、以下はそもそもコンパイルされません ( http://ideone.com/8VlKO4 ): #include using namespace std;

template <class C,typename T, T C::*v>
struct getPointerType {
typedef T type;
};

class Test {
int value;
};

int main() {
int Test::*member=nullptr;
cout << typeid(getPointerType<Test, int, decltype(member)>::type) << std::endl;
return 0;
}
4

1 に答える 1