メンバー ポインターが指すメンバーの型を抽出したいと思います。
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]);
buffer
はstd::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)
している限り、 member
defined asではなく参照uint32_t instance::*member
が生成されます。インスタンスを値で渡そうとしましたが、エラーが残ります。私は知っていますが、そもそも参照がどのようにそこにあるのかわかりません。 uint32_t&
uint32_t
std::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;
}