在"规则下运作,在阳光下永远不会有任何新东西,"我怀疑我是第一个提出这个伎俩的人。我想我最终会偶然发现在线记录它的东西,但我还没有,所以我想我会问。
其目的是选择性地启用某些功能,前提是它们是相关的,而不使用派生类。
这个模式有名字吗?是否有人对此模式或类似操作的模式有任何有用的信息?
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);
};
答案 0 :(得分:4)
我不会称之为模式,但这是一种已知技术。
主要被称为条件接口这种技术主要解决了编译时切换机制来打开和关闭类接口的问题。整个过程提供了切换成员存在的工具(因此术语条件编译就会诞生)。
这种技术或多或少地以你提出的方式实现(尽管在c ++ 11之前缺少别名模板不是问题)并且通常的问题是沉重,混乱,混乱和“丑陋”的模板机制样板码。
解决此问题, A. Alexandrescu gave a presentation关于这个话题。最初只是提到了对这种技术的需求:
说出
的子弹正在考虑你的技术以及需要编译时条件来切换函数的存在(条件接口)。
有关新语言功能的提案继续进行。由于我们都曾多次发明过这种轮子,为什么不用新的语言语法来让我们执行这样的事情。他的joint work 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]; }
}
};
好吧也许这不是最明智的使用它,但我想我正在传达这个想法。
现在在对方, B. Stroustroup 发布了一个paper,在知道问题static if
正在解决之后,他解释了为什么它是一个有缺陷的概念(双关语意图:))并且它的采用将成为语言的灾难(哎哟!)。
这是我的两分钱,从这次“对话”的参与者水平来看,我想就他们在哪一方,或者他们是否是标准化过程的一部分有一些反馈意见他们投票赞成。