贡献者: 待更新
<>
声明 template 类型)
<>
至少声明 return type
<>
声明 template parameter 的时候, 可以只声明前几个, 把剩下的留给编译器 deduce.
using <Base>::<fun>
才可以使用 Base class template 中的 overload 函数.
if constexpr
加上 <typetrait>
可以对不同的类型执行不同的代码 (没有 overhead).
T *
和 vector<T>
肯定比 T 更 specialled. 猜测大概是能接受的变量类型越少越 specialize.
if constexpr
加上 <typetrait>
可以对不同的类型执行不同的代码 (没有 overhead).
<typetrait>
里面有用的模板有 is_float<T>
, is_same<T1, T2>
template <class T, class T1>
inline void divide_equals_vs(T *v, const T1 &s, Long_I N)
{
constexpr std::is_floating_point<T> is_float;
if constexpr (is_float) {
times_equals_vs(v, 1./s, N);
}
else {
for (Long i = 0; i < N; ++i)
v[i] /= s;
}
}
if constexpr()
是编译时完成的, 相当于 #ifdef
, #endif
导致的条件编译, 所以没有编译到的部分即使对当前的情况有语法错误也没有关系. 例如下面这段 SLISC 中的代码, 当 T1, T2 是 Vector<> 或 Matrix<> 的时候, 即使 dim1()
, dim2()
, dim3()
没有定义也不会出错!
template <class T1, class T2>
Bool shape_cmp(const T1 &v1, const T2 &v2)
{
if constexpr (T1::ndims() == 1 && T2::ndims() == 1) {
return v1.size() == v2.size();
}
else if constexpr (T1::ndims() == 2 && T2::ndims() == 2) {
return v1.nrows() == v2.nrows() && v1.ncols() == v2.ncols();
}
else if constexpr (T1::ndims() == 3 && T2::ndims() == 3) {
return v1.dim1() == v2.dim1() && v1.dim2() == v2.dim2()
&& v1.dim3() == v2.dim3();
}
return false;
}
enum{};
的做法完全可以被 static constexpr
函数取代.
constexpr long myfac(long i)
{
if (i == 0)
return 1;
return myfac(i - 1)*i;
}
int main()
{
constexpr long i = myfac(4);
int a[i]; // totally ok!
long j = 5;
long k = myfac(j); // still ok!
}
std::common_type<T1, T2, ...>::type
返回一个共同的类型 T
使得所有的 T1, T2...
都可以 implicitly 转换成 T. 例如可以定义两种类型的加法为
template <class T1, class T2>
std::common_type<T1, T2, ...>::type myplus(const T1 &x, const T2 &y)
{
return x + y;
}
该函数 argument 如果输入 complex<double>
和 double
就可以返回前者, 输入 double
和 int
也可以返回前者.
...
 
 
 
 
 
 
 
 
 
 
 
友情链接: 超理论坛 | ©小时科技 保留一切权利