2011-06-05 14 views
9

मेरे पास वर्तमान में एक वैरैडिक फ़ंक्शन है जो मनमानी प्रकारों (डुह) के तर्कों की मनमानी संख्या लेता है, हालांकि, मैं उन प्रकारों को प्रतिबंधित करना चाहता हूं जो केवल पीओडी हैं, और साथ ही आकार या छोटे एक शून्य * की तुलना में।वैराडिक टेम्पलेट्स और टाइप ट्रेट्स

शून्य * जांच, आसान था मैं तो बस ऐसा किया:

static_assert(sizeof...(Args) <= sizeof(PVOID), "Size of types must be <= memsize."); 

हालांकि मैं बाहर काम नहीं कर सकता कैसे std :: is_pod के लिए भी ऐसा ही करने के लिए।

क्या यह संभव है?

+2

'sizeof ... (args)' शायद आप क्या चाहते हैं नहीं करता है - यह तर्क देता है कि तर्क पैक में कितने तर्क हैं (और उनके आकार नहीं)। [यह] देखें (http://ideone.com/X8X3p)। यदि आप अपने आकार को सीमित करना चाहते हैं, तो 'स्थिर कॉन्स बूल वैल्यू = आकार (हेड) <= sizeof (void *) && जैसे कुछ कर रहे हैं ...' मदद करेगा, यह देखें [http://ideone.com/PUMXx)। – Vitus

उत्तर

11

आप निर्धारित करने के लिए एक मेटा-समारोह लिख सकते हैं अगर सब पॉड प्रकार हैं:

template <typename... Ts> 
struct all_pod; 

template <typename Head, typename... Tail> 
struct all_pod<Head, Tail...> 
{ 
    static const bool value = std::is_pod<Head>::value && all_pod<Tail...>::value; 
}; 

template <typename T> 
struct all_pod<T> 
{ 
    static const bool value = std::is_pod<T>::value; 
}; 

तो

static_assert(all_pod<Args...>::value, "All types must be POD"); 
+0

जीसीसी 4.6 के तहत यह मुझे निम्नलिखित त्रुटि दे रहा है (प्रासंगिक भागों को देने के लिए छीन लिया गया है): "टेम्पलेट पैरामीटर सूची में तर्क 1 पर टाइप/मान विसंगति" "एक प्रकार की उम्मीद है," Args ... '" – RaptorFactor

+0

कोई बात नहीं, मैं एक मूर्ख हूँ। मैं मूल्यों को पारित नहीं कर रहा था। ओह। – RaptorFactor

+0

काम नहीं करता है जब 'Args ...' खाली है। बेहतर उपयोग: '' 'टेम्पलेट <> संरचना all_pod <> { स्थिर कॉन्स बूल मान = सत्य; }; '' 'बजाय' '' टेम्पलेट struct all_pod { स्थिर स्थिरांक bool मूल्य = std :: is_pod :: मूल्य; }; '' '' –

संबंधित मुद्दे