2016-11-24 6 views
8

मान लें मैं एक आवरण प्रकारis_nothrow_move_constructible <T> पर निर्भर करता है कि मैं एक रैपर प्रकार एक्स <T> के अलावा एक चालक कन्स्ट्रक्टर कैसे घोषित कर सकता हूं?

template <typename T> 
struct X {/*..*/}; 

है और मैं नहीं कर सकते हैं बस X(X&&) = default क्योंकि मैं वहाँ गैर तुच्छ सामान क्या करना है।

हालांकि, मैं इसे noexcept होना चाहता हूं, लेकिन केवल T(T&&)noexcept है। इसका परीक्षण ::std::is_nothrow_move_constructible के साथ किया जा सकता है।

मुझे नुकसान हुआ है कि constexpr के आधार पर कन्स्ट्रक्टर के दूसरे संस्करण को सशर्त रूप से कैसे सक्षम किया जाए। मुझे लगता है कि SFINAE का उपयोग करने का कोई तरीका हो सकता है, लेकिन मुझे नहीं लगता कि इसे ctors पर कैसे लागू किया जाए।

उत्तर

9

noexcept विनिर्देशक किसी भी बूलियन निरंतर अभिव्यक्ति को स्वीकार करता है, तो आप कर सकते हैं लेकिन वहाँ सीधे अपनी प्रकार विशेषता की जांच:

template <typename T> 
struct X { 
    X(X&&) noexcept(std::is_nothrow_move_constructible<T>::value) {} 
}; 
+0

Ooooookay, कि आसान था। चीयर्स। (मैं एक घंटे में स्वीकार करूंगा) – bitmask

+0

मैं इसे निम्नलिखित के लिए उपयोग कर रहा हूं, बस किसी के आश्चर्य के मामले में ... http://codereview.stackexchange.com/q/147999/7189 – bitmask

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

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