【问题标题】:C++ constraints enable_if vs requiresC++ 约束 enable_if 与需要
【发布时间】:2016-05-19 06:57:20
【问题描述】:

我只是顺着C++的requires关键字跑了,想知道我的理解到现在是否正确:requiresenable_if都提供编译模板的时间限制。如果 require 约束将被包括在内。

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 条件将评估限制为整数类型。

感谢您告诉我是否正确!

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

【问题讨论】:

标签: c++ templates constraints enable-if c++-concepts


【解决方案1】:

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

Ville's Jacksonville paper 关于他在 C++17 中包含概念的基本原理很好地解释了与概念相比基于 SFINAE 的约束的缺陷。本质上:

  • 概念允许在不关闭推导且不干扰受约束函数模板的元参数的情况下约束函数参数。
  • 概念使编写具有互斥约束的重载变得更加容易。
  • 概念支持广泛的约束设计,为界面设计人员提供各种工具来决定特定界面需要哪种抽象。

【讨论】:

  • 非常感谢链接,表示我不喜欢但不敢谈论的问题!希望我们很快就会有概念。回答赞成!
  • Concepts 以何种方式使编写具有互斥约束的重载变得更容易?
猜你喜欢
  • 2010-10-18
  • 2016-12-19
  • 2021-06-08
  • 2021-02-10
  • 1970-01-01
  • 2017-10-14
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多