【发布时间】:2019-05-24 03:54:05
【问题描述】:
在引入概念和约束之前,有几种方法可以模拟这种编译时检查。以“order()”函数为例:(如何在没有概念或约束的情况下实现LessThanComparable是另一回事)
-
使用
static_asserttemplate <typename T, typename U> void order(T& a, U& b) { static_assert(LessThanComparable<U,T>, "oh this is not epic"); if (b < a) { using std::swap; swap(a, b); } }这种方法不适用于函数重载。
-
使用
typename = enable_iftemplate <typename T, typename U, typename = std::enable_if_t<LessThanComparable<U,T>>>> void order(T& a, U& b) { if (b < a) { using std::swap; swap(a, b); } }如果一个过分“聪明”的人手动指定第三个参数怎么办?
-
在函数原型中使用
enable_if:template <typename T, typename U> std::enable_if_t<LessThanComparable<U,T>>, void> order(T& a, U& b) { if (b < a) { using std::swap; swap(a, b); } }有时在函数重载中也不起作用。
-
使用
enable_if作为伪非类型模板参数的类型template <typename T, typename U, std::enable_if_t<LessThanComparable<U,T>>, void*> = nullptr> // or int = 0 void order(T& a, U& b) { if (b < a) { using std::swap; swap(a, b); } }我以前看过这个,我想不出有什么缺点。
还有许多其他变体。
哪些更受欢迎或推荐?有什么好处和坏处? 任何帮助表示赞赏。
【问题讨论】:
-
通常的方式是使用type traits。
-
@πάνταῥεῖ 你的意思是实现
LessThanComparable的常用方法? -
不,我的意思是一般。类型特征用于验证模板参数的概念和约束。
-
@πάνταῥεῖ 是的,它们在元编程中非常有用????
-
非类型模板参数方法有一个小缺点。如果您希望将定义与声明分开(例如,对于模板成员函数),您必须复制“约束”。
标签: c++ c++11 template-meta-programming sfinae enable-if