Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这个SFINAE模式有名字吗?_C++_Templates_Design Patterns_Sfinae - Fatal编程技术网

C++ 这个SFINAE模式有名字吗?

C++ 这个SFINAE模式有名字吗?,c++,templates,design-patterns,sfinae,C++,Templates,Design Patterns,Sfinae,在“天下无新事”的原则下运作,我怀疑我是第一个想出这个把戏的人。我想我最终会在网上偶然发现一些记录它的东西,但我还没有,所以我想我会问 它的目的是有选择地启用某些相关函数,而不使用派生类 这个图案有名字吗?有没有人对这种模式或类似的模式有任何有用的信息 template<typename T, size_t N> class Point { public: template<size_t P, typename T2=void> using Enable2D =

在“天下无新事”的原则下运作,我怀疑我是第一个想出这个把戏的人。我想我最终会在网上偶然发现一些记录它的东西,但我还没有,所以我想我会问

它的目的是有选择地启用某些相关函数,而不使用派生类

这个图案有名字吗?有没有人对这种模式或类似的模式有任何有用的信息

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);
};
模板
类点{
公众:
模板
如果:type,则使用Enable2D=typename std::enable_;
模板
如果使用Enable3D=typename std::enable_::type;
模板
使用Enable4D=typename std::enable_如果::type;
模板
如果

=2&&N==P,T2>::type,则使用Enable2DOrHigher=typename std::enable_; 模板 如果

=3&&N==P,T2>:type,则使用Enable3DOrHigher=typename std::enable_; 模板 如果

=4&&N==P,T2>::type,则使用Enable4DOrHigher=typename std::enable_; //示例用例 模板 静态启用2D带角度(T角度,T幅值=1); 模板 静态启用3D角度(T psi,Tθ,T幅值=1); 模板 启用2或更高的常量&x()常量; 模板 启用2或更高的常量&y()常量; 模板 使能2或更高

setX(T常数&T); 模板 使能2或更高

setY(T常数&T); 模板 启用3或更高的常量&z()常量; 模板 使能3或更高

setZ(T常数&T); 模板 启用4或更高的常量&w()常量; 模板 使能4或更高

setW(T常数&T); };


我不会称之为模式,但这是一种已知的技术

这项技术主要解决编译时切换机制打开和关闭类接口的问题。整个过程还提供了切换成员存在的工具(因此术语条件编译就诞生了)

该技术或多或少是按照您提出的方式实现的(尽管缺少别名模板在c++11之前不是问题),通常的问题是繁重、混乱、混乱和“丑陋”的模板机制样板代码

关于这个问题,A.Alexandrescu关于这个话题。最初,有一点提到了对这种技术的需求:

子弹上写着

  • 此函数仅适用于数字
是指您的技术和需要编译时条件来切换函数(条件接口)的存在

演讲接着提出了一项新的语言功能的建议。他说,既然我们都发明了轮子好几次,为什么不发明一种新的语言语法,让我们能够执行这些事情呢。他与H.Sutter的合作,产生了一个编译时切换工具,可以消除您提到的解决方法。这一点的一个简单用法是

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]; }
    }
};
模板
结构向量
{
双坐标[D];
静态if(D){
双x(){返回坐标[0];}
}
静态if(D>1){
双y(){返回坐标[1];}
}
静态if(D>2){
双z(){返回坐标[2];}
}
};
好吧,也许这不是最明智的使用,但我想我是在传达这个想法

现在,在对立的一方,B.Stroustroup发表了一篇文章,在承认了问题
静态if
正在解决后,他解释了为什么它是一个有缺陷的概念(双关语:意为:))并且它的采用将是语言的灾难(哎哟!)


这是我的两分钱,从这次“对话”参与者的水平来看,我想得到一些反馈,关于他们站在哪一边,或者他们是否是标准化过程的一部分,他们将投什么票

这是一个有趣的想法——本质上是参数化成员函数指针。在javascript中,您可以构建“原型”对象,从而有条件地创建某些成员函数。我没有见过任何类似的C++。好奇地想看到回复……这方面的激励性用例是,我们也有采用标准点的多维线条和长方体类,但我们以前有用于点2和点3的派生类,因此这些类本身无法访问有用的2d和3d点函数(除非我们也要派生这些代码,在这种情况下,这将是一个重新实现,因为成员已经更改,并且有很多通用代码,DRY)我们也认为使用SimeAE的任何代码都是干净的,即使它使暴露的函数稍微不一致。为什么要重复使用<代码> Enable?如果成为一个模式?这是一个典型的应用:<代码>“根据类型特征有条件地从重载解析中删除函数和类,并为不同类型特征提供单独的函数重载和专门化“…似乎完全包含了您所做的。我以前做过:我做过类似的事情,但没有
enable\u if
。我自己的元组类型与元素类型
E..
派生类,其中
D
是派生类(元组)通过为
访问提供两个专门化,一个元素的元组有一个成员
val()
,两个元素的元组有成员
fst()
snd()
(如
std::pair
中的
第一个
第二个
)。这与您的
x()
y()的效果相同
,等等。另外,
访问
可以作为任何类型的基础插入(有几十种元组专门化)。我不知道多少历史,但可能是它