Template argument deduction for class templates प्रस्ताव के बारे में मेरी समझ कटौती संदर्भों में टेम्पलेट कार्यों और टेम्पलेट कक्षाओं के व्यवहार को समेकित करना था। लेकिन मुझे लगता है कि मुझे कुछ गलत समझा जाना चाहिए था।सी ++ 17 वर्ग टेम्पलेट आंशिक कटौती
हम इस टेम्पलेट वस्तु है, तो:
template <std::size_t S, typename T>
test<S, T> helper(T (&input)[S]) { return input; }
कौन सा नीचे दिखाया गया के रूप में इस्तेमाल किया जा सकता है:
template <std::size_t S, typename T>
struct test
{
static constexpr auto size = S;
using type_t = T;
test(type_t (&input)[size]) : data(input) {}
type_t (&data)[size]{};
};
मैं test
वस्तुओं बनाने के लिए वाक्यात्मक चीनी के रूप में एक सहायक समारोह का उपयोग करते हैं:
int main()
{
int buffer[5];
auto a = helper<5, int>(buffer); // No deduction
auto b = helper<5>(buffer); // Type deduced
auto c = helper(buffer); // Type and size deduced
std::cout << a.size << b.size << c.size;
return 0;
}
उम्मीद के अनुसार 555
आउटपुट के ऊपर कोड। मैं नए संकलक सेटअप का उपयोग कर Wandbox में एक ही कोशिश की है:
int main()
{
int buffer[5];
test<5, int> a(buffer); // No deduction: Ok.
test<5> b(buffer); // Type deduced: FAILS.
test c(buffer); // Type and size deduced: Ok.
std::cout << a.size << b.size << c.size;
return 0;
}
यह वर्ग टेम्पलेट्स के लिए टेम्पलेट तर्क कटौती की तरह दिखता है केवल सभी मापदंडों, मैं दोनों व्यवहार (सहायक समारोह और वर्ग उम्मीद कर रहा था बात का अनुमान लगाना काम करता है टेम्पलेट) वही होना चाहिए, क्या मैंने कुछ गलत समझा?
Wandbox में पिछले compilers availables जीसीसी प्रमुख 7.0.1 201,701 और बजना प्रमुख 5.0.0 (ट्रंक) हैं।
'type_t (और डेटा) [आकार] {} है;' एक सरणी संदर्भ? क्या '{}' प्रारंभकर्ता है? क्या वह संकलित करता है? इसके अलावा, * सिंटैक्टिक चीनी * बहुत शरारती लगता है। :) – wally
ध्यान दें कि [एक स्पष्ट * कटौती गाइड *] जोड़ना (http://melpon.org/wandbox/permlink/VEE5DyIE3w3LEGEX) मदद नहीं करता है।मेरा मानना है कि आंशिक कटौती समर्थित नहीं है क्योंकि मानक * टेम्पलेट नाम * * (यानी '<...> 'वाक्यविन्यास के साथ * कटौती प्लेसहोल्डर्स को परिभाषित करता है *। इसलिए 'परीक्षण <5> 'वैध कटौती प्लेसहोल्डर नहीं है। –
@ मस्कैम्पस्टर 'टाइप_टी (और डेटा) [आकार] {}; 'एक सरणी संदर्भ है, हां। '{}' वास्तव में प्रारंभकर्ता है, और यह संकलित करता है [इसे आज़माएं!] (Http://melpon.org/wandbox/permlink/KCkDg5EEIKbZbPU3)। * सिंटैक्टिक शुगर * के बारे में मैं क्या कह सकता हूं ...: '(अंग्रेजी मेरी मां नहीं है और मुझे बहुत सारी गलतियां हैं! –