2017-09-11 20 views
7

निम्नलिखित उदाहरण पर विचार करें।टेम्पलेट प्रकार की कटौती विफल हो जाती है?

#include <type_traits> 
#include <iostream> 
using namespace std; 

template <typename T_> 
using Integral = typename std::enable_if<std::is_integral<T_>::value,T_>::type; 
template <typename T_> 
using NotIntegral = typename std::enable_if<!std::is_integral<T_>::value, T_>::type; 

template <typename T_> 
void printIt(const Integral<T_> &value) { cout << "Integral == " << value << endl; } 

template <typename T_> 
void printIt(const NotIntegral<T_> &value) { cout << "Non Integral == " << value << endl; } 

template <typename T_> 
void foo(const T_ &value) { printIt<T_>(value); } 

int main(int argc, char** argv) 
{ 
    printIt<int>(66); //Must explicitly provide argument type. 
    //printIt(33);  //Compiler error. No overloaded function....???? 
    foo(29.); 

    return 0; 
} 

क्यों मैं स्पष्ट रूप से टेम्पलेट पैरामीटर के प्रकार निर्धारित करने की आवश्यकता है? क्या संकलक को यह पता लगाना चाहिए कि यह int प्रकार तर्क है?

उत्तर

11

मुझे टेम्पलेट पैरामीटर के प्रकार को स्पष्ट रूप से सेट करने की आवश्यकता क्यों है?

क्योंकि ये non-deduced contexts हैं।

std::enable_if<std::is_integral<T_>::value,T_> विशेषज्ञता का कल्पना करें ताकि ::type किसी अन्य चीज़ का मूल्यांकन कर सके। कंपाइलर typename something<T>::type से T पर मानचित्रण को नहीं जान सकता है।

आप std::enable_if वापसी प्रकार के भाग के रूप रखकर अपने वांछित परिणाम प्राप्त कर सकते हैं ताकि न खाने वाले भार के बाहर SFINAEd रहे हैं:

template <typename T> 
auto printIt(T x) -> std::enable_if_t<std::is_integral_v<T>, void> { /*...*/ } 

template <typename T> 
auto printIt(T x) -> std::enable_if_t<!std::is_integral_v<T>, void> { /*...*/ } 

live wandbox example

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