मुझे सदस्य चयनकर्ता के साथ template
से offsetof
का उपयोग करने की आवश्यकता है। मैं एक तरह से ले कर आए हैं, यदि आप अजीब वाक्य रचना बहाना होगी:सी ++ संकलन-समय टेम्पलेट के अंदर ऑफसेट करें
template <typename T,
typename R,
R T::*M
>
constexpr std::size_t offset_of()
{
return reinterpret_cast<std::size_t>(&(((T*)0)->*M));
};
उपयोग (सबसे अच्छे रूप में कष्टप्रद) सही नहीं है:
struct S
{
int x;
int y;
};
static_assert(offset_of<S, int, &S::x>() == 0, "");
static_assert(offset_of<S, int, &S::y>() == sizeof(int), "");
गैर constexpr
रूप में आसान है उपयोग करने के लिए:
template <typename T, typename R>
std::size_t offset_of(R T::*M)
{
return reinterpret_cast<std::size_t>(&(((T*)0)->*M));
};
स्पष्ट नुकसान यह है कि यह संकलन समय पर नहीं किया जाता है (लेकिन आसान उपयोग करने के लिए) पर:
int main()
{
std::cout << offset_of(&S::x) << std::endl;
std::cout << offset_of(&S::y) << std::endl;
}
जो मैं खोज रहा हूं वह वाक्यविन्यास गैर-constexpr
विविधता है, लेकिन अभी भी पूरी तरह से संकलित समय है; हालांकि, मैं इसके लिए वाक्यविन्यास के साथ नहीं आ सकता। मैं offset_of<&S::x>::value
(बाकी प्रकार के लक्षणों की तरह) से भी खुश हूं, लेकिन इसके लिए सिंटैक्स जादू नहीं समझ सकता।
मैं यह पता लगाने की कोशिश कर रहा हूं कि मानक कहां कहता है कि यह वही करता है जो आप उम्मीद करते हैं। लेकिन मुझे यह नहीं मिल रहा है। –
मानक ['ऑफसेटफ'] (http://en.cppreference.com/w/cpp/types/offsetof) के साथ क्या गलत है? –
@ निकोलबोलस मुझे लगता है कि यह नहीं है। 'Nullptr' की कमी नहीं होनी चाहिए (और मुझे लगता है कि '->' dereference के रूप में गिना जाता है) यूबी पहले से ही हो सकता है? लेकिन फिर, 'ऑफसेटोफ' मैक्रो का वीसी संस्करण कोई अलग नहीं है। तो व्यवहार में यह शायद अपरिभाषित की तुलना में परिभाषित परिभाषित है। –