前言
众所周知,STL的函数模板不能特化,所以怎么解决这个问题呢在实际需要的时候,请看下文
一、解决函数模板不能特化问题
示例1返回值限定:
template <typename T> typename std::enable_if<std::is_same<char*, T>::value || std::is_same<const char*, T>::value>::type BindValue(sqlite3_stmt *pStatement, int iCurrent, T t);
template <typename T> typename std::enable_if<std::is_integral<T>::value>::type BindValue(sqlite3_stmt *pStatement, int iCurrent, T t);
template <typename T> typename std::enable_if<std::is_same < T, int64_t > ::value || std::is_same<T, uint64_t>::value> ::type BindlntValue(sqlite3_stmt *pStatement, int iCurrent, T t);
template <typename T> typename std::enable_if<!std::is_same<T, int64_t>::value && !std::is_same<T, uint64_t>::value>::type BindlntValue(sqlite3_stmt *pStatement, int iCurrent, T t);
示例2入参:
//对入参做限定,第二个入参类型为integral
template<class T>
T foo2(T t, typename std::enable_if<std::is_integral<T>::value,int>::type = 0)
{
return t;
}
示例3:
//对模板参数T做了限定,T只能是integral
template <class T, class = typename std::enable_if<std::is_integral<T>::value>::type>
T foo3(T t)
{
return t;
}
总结
使用std::enable_if解决模板函数不能特化问题;同时利用这个特性可以解决switch-case、if-else 带来的圈复杂度高的问题。