यह संभव नहीं है।
template<int N>
struct foo {
static const int value = N;
};
और प्रकार
template<typename T>
struct foo {
typedef T type;
};
के लिए आप foo<39>::value
या foo<int>::type
के रूप में तो यह पहुँच सकते हैं: हमेशा की तरह आप यह कर इस है। वास्तव में,
template<typename>
struct steal_it;
template<std::size_t N>
struct steal_it< std::bitset<N> > {
static const std::size_t value = N;
};
इसी सिद्धांत भी प्रकार पैरामीटर के लिए संभव है:
आप एक विशेष प्रकार है, तो आप आंशिक टेम्पलेट विशेषज्ञता का उपयोग कर सकते हैं। अब आप steal_it< std::bitset<16> >::value
(आकार_टी का उपयोग करने के लिए नोट, int नहीं!) की तरह किसी भी बिटसेट को पास कर सकते हैं। चूंकि हमारे पास अभी तक कोई भिन्न टेम्पलेट पैरामीटर नहीं है, इसलिए हमें अपने आप को एक विशेष पैरामीटर गिनती तक सीमित करना होगा, और 1 से लेकर एन तक गिनती के लिए steal_it टेम्पलेट विशेषज्ञता दोहराएं। एक और कठिनाई उन प्रकारों को स्कैन करना है जिनमें मिश्रित पैरामीटर (प्रकार और गैर- प्रकार पैरामीटर)। यह हल करने के लिए शायद असंभव है।
आप नहीं प्रकार है, लेकिन केवल इसके बारे में एक वस्तु है, तो आप एक चाल का उपयोग कर सकते हैं, अभी भी संकलन समय पर मूल्य प्राप्त करने के:
template<typename T>
char (& getN(T const &))[steal_it<T>::value];
int main() {
std::bitset<16> b;
sizeof getN(b); // assuming you don't know the type, you can use the object
}
चाल समारोह टेम्पलेट ऑटो बनाने के लिए है प्रकार को कम करें, और फिर एक वर्ण सरणी के संदर्भ को वापस करें। फ़ंक्शन को परिभाषित करने की आवश्यकता नहीं है, केवल एक चीज की आवश्यकता है।
स्रोत
2008-11-19 07:53:58
अच्छी चाल। एक बात हालांकि, आप यह कहकर शुरू करते हैं कि यह कैसे संभव नहीं है, लेकिन फिर यह दिखाने के लिए आगे बढ़ें! :) –
@ रिचर्ड कॉर्डन: मुझे लगता है कि वह कह रहा था कि आरटीटीआई – cdleary
रिचर्ट कॉर्डन का उपयोग करना संभव नहीं है। मेरा मतलब है कि मनमाने ढंग से टेम्पलेट पैरामीटर चुनना आम तौर पर संभव नहीं है। इस पर विचार करें: टेम्पलेट <टेम्पलेट कक्षा, वर्ग, आकार_टी> कक्षा foo; वह चाल उनके प्रकार नहीं मिलेगी :) –