Jac*_*nde 7 c++ templates type-traits c++11 type-deduction
请考虑以下示例.
#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;
}
Run Code Online (Sandbox Code Playgroud)
为什么我需要显式设置模板参数的类型?编译器应该弄清楚它是一个int
类型参数吗?
Vit*_*meo 11
为什么我需要显式设置模板参数的类型?
因为这些是非推断的上下文.
想象一下专业化,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> { /*...*/ }
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
279 次 |
最近记录: |