C++ 约束 enable_if 与要求
C++ constraints enable_if vs requires
我只是 运行 沿着 C++ requires 关键字,想知道我的理解到目前为止是否正确: requires 和 enable_if 为模板提供编译时间限制。如果 require 约束将被完全包含。
其中requires提供了一种约束函数参数的方式,enable_if的主要目的是限制编译时间t运行模板类型本身的特定条件。
示例:
#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 约束的语法,这似乎有所不同。另外,暂时不知道哪个编译器接受它们,所以感谢任何提示!
是的,你的理解似乎是正确的。使用 SFINAE 来约束模板(例如 enable_if
)与概念约束模板具有相同的基本效果。但是(正如您提到的),SFINAE 有额外的副作用。
Ville's Jacksonville paper 关于他在 C++17 中包含概念的基本原理,与概念相比,它很好地解释了基于 SFINAE 的约束的缺陷。本质上:
- 概念允许在不关闭推导且不干扰受约束函数模板的元元数的情况下约束函数参数。
- 概念使得编写具有互斥约束的重载变得更加容易。
- 概念支持广泛的约束设计,为界面设计者提供各种工具来决定特定界面需要哪种抽象。
我只是 运行 沿着 C++ requires 关键字,想知道我的理解到目前为止是否正确: requires 和 enable_if 为模板提供编译时间限制。如果 require 约束将被完全包含。
其中requires提供了一种约束函数参数的方式,enable_if的主要目的是限制编译时间t运行模板类型本身的特定条件。
示例:
#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 约束的语法,这似乎有所不同。另外,暂时不知道哪个编译器接受它们,所以感谢任何提示!
是的,你的理解似乎是正确的。使用 SFINAE 来约束模板(例如 enable_if
)与概念约束模板具有相同的基本效果。但是(正如您提到的),SFINAE 有额外的副作用。
Ville's Jacksonville paper 关于他在 C++17 中包含概念的基本原理,与概念相比,它很好地解释了基于 SFINAE 的约束的缺陷。本质上:
- 概念允许在不关闭推导且不干扰受约束函数模板的元元数的情况下约束函数参数。
- 概念使得编写具有互斥约束的重载变得更加容易。
- 概念支持广泛的约束设计,为界面设计者提供各种工具来决定特定界面需要哪种抽象。