概念可能会取代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一样并且可能不用作约束。(如果它被误用或间接应用于语言对我来说很好)

注意:我不问概念如何以正确的方式使用,但我试图问概念是否可能在编译时谓词方面替换类型特征。

以上是概念可能会取代C++中的类型特征吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>