2011-03-15 18 views
10

मैं std :: सशर्त में दूसरे तर्क का आलसी मूल्यांकन कैसे कर सकता हूं? अब std::conditional के बादआलसी मूल्यांकन

template <typename T> 
struct false_case { 
    typedef typename std::conditional<T::one,_1,_2>::type type; 
}; 

struct always_null {typedef Null type;}; 

template<class T> 
struct X : 
    std::conditional<is_nulltype<T>::value, 
        always_null, 
        false_case<T> 
        >::type::type { ... }; 

नोट दो ::type रों:

#include "stdafx.h" 
#include <type_traits> 

struct Null{}; 
struct _1{enum {one = true,two = false};}; 
struct _2{enum {two = true, one = false};}; 

template<class T> 
struct is_nulltype 
{ 
    enum {value = false}; 
}; 

template<> 
struct is_nulltype<Null> 
{ 
    enum {value = true}; 
}; 

template<class T> 
struct X : std::conditional<is_nulltype<T>::value,Null,typename std::conditional<T::one,_1,_2>::type>::type 
{ 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
X<Null> x;//won't compile no Null::one but I don't need that member in Null at all 
    return 0; 
} 
+1

हाथ की समस्या के लिए, बस 'शून्य' प्रकार के लिए 'एक्स' विशेषज्ञ'। –

+0

@ एएलएफ का मतलब यह होगा कि मेरे पास दो "लगभग" पहचान वर्ग हैं। नही जाओ। –

+0

ऐसा लगता है कि आप जो खोज रहे हैं वह "आलसी संकलन" है और "आलसी मूल्यांकन" नहीं है। एक्स की परिभाषा में टी के लिए नल के प्रतिस्थापन एक वाक्यविन्यास त्रुटि का कारण बनता है। वाक्यविन्यास का मूल्यांकन देरी नहीं हो सकती है। – goedson

उत्तर

9

इस के लिए सामान्य तकनीक std::conditional दो metafunctions के बीच चयन करने के लिए है।

+0

'false_case' को बेस क्लास के रूप में 'सशर्त' हो सकता है ताकि इसे थोड़ा छोटा कर दिया जा सके। – aaz

+0

धन्यवाद, मुझे लगता है कि यह वही करेगा जो मैंने किया है। यदि नहीं, तो मैं आपको बता दूंगा। –

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