概念可能会取代C++中的类型特征吗?
我已经知道这个概念是一个编译时谓词,它可以约束模板或auto.
我发现这些概念将返回 type 的纯右值bool,所以我可以打印它来测试自己。
我还阅读了这个特定问题Can概念(C++ 20)可以用作布尔值吗?以及澄清可用作布尔值的概念的答案。
[temp.names]
(8) 一个concept-id 是一个simple-template-id,其中template-name 是一个concept-name。概念 ID 是 bool 类型的纯右值,并且不命名模板特化。如果指定的模板参数满足概念的规范化约束表达式 ([temp.constr.constr]),则概念 ID 评估为真,否则为假。
例如:
template <typename T>
concept meowable = requires (T obj) {
{ obj.meow() } -> std::same_as<T&>;
};
struct Dog {};
struct Cat { Cat& meow(); };
struct Wolf { Wolf& woof(); };
应用:
std::cout << std::boolalpha;
std::cout << "Has meow?" << 'n'
<< "Dog: " << meowable<Dog> << 'n'
<< "Cat: " << meowable<Cat> << 'n'
<< "Wolf: " << meowable<Wolf> << 'n';
输出:
Has meow?
Dog: false
Cat: true
Wolf: false
我还可以根据概念创建类型特征:
template <typename T>
struct has_meow : std::bool_constant<meowable<T>> {};
template <typename T>
constexpr bool has_meow_v = has_meow<T>::value;
应用:
std::cout << "Has meow?" << 'n'
<< "Dog: " << has_meow_v<Dog> << 'n'
<< "Cat: " << has_meow_v<Cat> << 'n'
<< "Wolf: " << has_meow_v<Wolf> << 'n';
其输出与上面相同。
根据我对类型特征的了解,它们是能够检查类型的“属性”的技术,其中包括编译时谓词(不是概念,例如:is_void, is_bounded_array)。如果我没记错的话,它们现在是“反射”的一部分。
我的主要问题是:概念可能会取代类型特征吗?
这似乎是一个循环:概念使用类型特征,而类型特征可能使用概念。
- 概念是否有助于类型特征在模板元编程的世界中扩展?
- 当
requires“误用”时,我什么时候将这些概念或表达式作为“帮助者”/“胜任者”应用到类型特征中,就像使用的方式std::enable_if一样并且可能不用作约束。(如果它被误用或间接应用于语言对我来说很好)
注意:我不问概念如何以正确的方式使用,但我试图问概念是否可能在编译时谓词方面替换类型特征。