Omn*_*ity 6 c++ templates design-patterns sfinae
统治下的操作"从未有任何新的东西在阳光下,"我怀疑我是第一人想出这一招.我想我最终会偶然发现在线记录它的东西,但我还没有,所以我想我会问.
其目的是选择性地启用提供的某些功能,他们是相关的,不使用派生类.
这个模式有名字吗?而且没有人对这种模式或类似的经营模式的任何有用的信息?
template<typename T, size_t N>
class Point {
public:
template<size_t P, typename T2=void>
using Enable2D = typename std::enable_if<P == 2 && N == P, T2>::type;
template<size_t P, typename T2=void>
using Enable3D = typename std::enable_if<P == 3 && N == P, T2>::type;
template<size_t P, typename T2=void>
using Enable4D = typename std::enable_if<P == 4 && N == P, T2>::type;
template<size_t P, typename T2=void>
using Enable2DOrHigher = typename std::enable_if<P >= 2 && N == P, T2>::type;
template<size_t P, typename T2=void>
using Enable3DOrHigher = typename std::enable_if<P >= 3 && N == P, T2>::type;
template<size_t P, typename T2=void>
using Enable4DOrHigher = typename std::enable_if<P >= 4 && N == P, T2>::type;
//Example use cases
template<size_t P=N>
static Enable2D<P, Point> withAngle(T angle, T magnitude = 1);
template<size_t P=N>
static Enable3D<P, Point> fromAngles(T psi, T theta, T magnitude = 1);
template<size_t P=N>
Enable2DOrHigher<P, T> const& x() const;
template<size_t P=N>
Enable2DOrHigher<P, T> const& y() const;
template<size_t P=N>
Enable2DOrHigher<P> setX(T const& t);
template<size_t P=N>
Enable2DOrHigher<P> setY(T const& t);
template<size_t P=N>
Enable3DOrHigher<P, T> const& z() const;
template<size_t P=N>
Enable3DOrHigher<P> setZ(T const& t);
template<size_t P=N>
Enable4DOrHigher<P, T> const& w() const;
template<size_t P=N>
Enable4DOrHigher<P> setW(T const& t);
};
Run Code Online (Sandbox Code Playgroud)
我不会称其为模式,但它是一种已知的技术。
该技术通常被称为条件接口,主要解决用于打开和关闭类接口的编译时切换机制的问题。整个过程还提供了切换成员是否存在的工具(因此条件编译一词诞生了)。
该技术或多或少是按照您建议的方式实现的(尽管缺乏别名模板在 c++11 之前不是问题),通常的问题是繁重、混乱、令人困惑和“丑陋”的模板机械样板代码。
针对这个问题,A. Alexandrescu 做了有关该主题的演讲。最初有一点提到了这种技术的需求:
子弹说
指的是您的技术以及需要编译时条件来切换函数的存在(条件接口)。
演讲继续讨论了一项新语言功能的提案。他说,既然我们都发明了轮子几次,为什么不开发一种新的语言语法,让我们能够执行这样的事情呢?他与H. Sutter合作,制作了一个编译时切换器,可以消除您提到的解决方法的需要。一个简单的用法是static if
template<int D>
struct Vector
{
double coordinates[D];
static if ( D ) {
double x() { return coordinates[0]; }
}
static if ( D > 1 ) {
double y() { return coordinates[1]; }
}
static if ( D > 2 ) {
double z() { return coordinates[2]; }
}
};
Run Code Online (Sandbox Code Playgroud)
好吧,也许这不是它最聪明的用法,但我想我正在传达这个想法。
现在,在反对方,B. Stroustroup发表了一篇论文,在承认问题static if
正在解决后,他解释了为什么这是一个有缺陷的概念(双关语:)),并且它的采用对于语言来说将是一场灾难(哎哟!)。
这是我的两分钱,从这次“对话”参与者的水平来看,我想得到一些关于他们站在哪一边的反馈,或者如果他们是标准化过程的一部分,他们将投票什么为了。