6

我刚刚运行了 C++ requires关键字,想知道到目前为止我的理解是否正确:requiresenable_if都为模板提供编译时间约束。如果需要约束将被包括在内。

其中requires提供了一种约束函数参数的方法,enable_if的主要目的是将编译时转换限制为模板类型本身的某些条件。

例子:

#include <type_traits>

template<typename T>
concept T AdditiveGroup
{
  return requires(const T pA, const T pB)
  {
    { pA + pB }->T;
  };
};

template<typename T>
typename std::enable_if<std::is_integral<T>::value, bool>::type
addElements(const T pA, const T pB)
{ 
  return (pA + pB);
}

在这里,当且仅当 pA 和 pB 可以添加时,该概念才有效,而 enable_if 条件将评估限制为整数类型。

感谢您让我知道我是否做对了!

PS:我还不太确定require约束的语法,这似乎有所不同。另外,暂时不知道哪个编译器接受它们,所以感谢任何提示!

4

1 回答 1

8

是的,您的理解似乎是正确的。使用 SFINAE 约束模板(例如enable_if)具有与概念约束模板相同的本质效果。但是(正如您所提到的),SFINAE 有额外的副作用。

Ville 的 Jacksonville 论文关于他在 C++17 中包含概念的理由非常出色地解释了与概念相比基于 SFINAE 的约束的缺陷。本质上:

  • 概念允许约束函数参数而不关闭推导并且不干扰约束函数模板的元参数。
  • 概念使编写具有互斥约束的重载变得更加容易。
  • 概念支持广泛的约束设计,为界面设计者提供各种工具来决定特定界面需要什么样的抽象。
于 2016-05-19T08:55:43.417 回答