निम्नलिखित उदाहरण पर विचार करें।टेम्पलेट प्रकार की कटौती विफल हो जाती है?
#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
प्रकार तर्क है?