Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 概念是否可能取代C++;?_C++_Template Meta Programming_C++20_Typetraits_C++ Concepts - Fatal编程技术网

C++ 概念是否可能取代C++;?

C++ 概念是否可能取代C++;?,c++,template-meta-programming,c++20,typetraits,c++-concepts,C++,Template Meta Programming,C++20,Typetraits,C++ Concepts,我已经知道这个概念是一个编译时谓词,它可以约束模板或auto 我发现这些概念将返回类型为bool的PR值,因此我可以打印它来测试自己 我还阅读了这个特定的问题,以及澄清可以用作布尔值的概念的答案 [临时名称] (8) 概念id是一个简单的模板id,其中模板名称是概念名称。概念id是bool类型的prvalue,不命名模板专门化。如果指定的模板参数满足概念的规范化约束表达式([temp.constr.constr]),则概念id的计算结果为true,否则为false 例如: 模板 概念meowab

我已经知道这个概念是一个编译时谓词,它可以约束模板或
auto

我发现这些概念将返回类型为
bool
的PR值,因此我可以打印它来测试自己

我还阅读了这个特定的问题,以及澄清可以用作布尔值的概念的答案

[临时名称] (8) 概念id是一个简单的模板id,其中模板名称是概念名称。概念id是bool类型的prvalue,不命名模板专门化。如果指定的模板参数满足概念的规范化约束表达式([temp.constr.constr]),则概念id的计算结果为true,否则为false

例如:

模板
概念meowable=需要(T obj){
{obj.meow()}->std::与相同;
};
结构狗{};
结构Cat{Cat&meow();};
结构Wolf{Wolf&woof();};
应用程序:

std::cout(注意:这个答案是在OP开始更新和扩展原始问题之前写的)

<>我在C++中应用这些东西是什么时候?< /P> 当在requires子句的约束逻辑或表达式中使用概念时,概念id是bool类型的prvalue这一事实至关重要:

其中约束逻辑或表达式依次为,其中包括

例如,如以下(人为)示例所示:

#包括
#包括
模板
概念有静态需求(T obj){
{decltype(obj)::meow()}->std::与相同;
};
模板
概念有静态需求(T obj){
{decltype(obj)::bark()}->std::与相同;
};

{静态空格BARK({ STD::):我很高兴你问这个问题。它显示你正在深入C++中并进行批判性思考。概念在元编程(模板)中使用,以选择适当的类或函数的实现(或者不选择一个)。。也就是说,这是一个非常广泛的问题,充分的讨论可能超出了范围。所以,你在问题中使用了这个“东西”。它问你如何使用它。那么,提问和回答?…但你仍然需要逐字回答OP的问题:-(@einpoklum当我开始回答这个问题时,我只是读了OP的第1版(或者可能是第2版)他的问题,在问题爆发之前,主要问题是“我什么时候在C++中应用这些东西?”我道歉如果我问的方式不一致,但每次我试图改变我的帖子我的意思是什么。
template<...>
void f() requires .... {}
//                ^^^^ - constraint-logical-or-expression 
//       
//       ^^^^^^^^^^^^^ - requires-clause 
requires-clause:
  requires constraint-logical-or-expression
#include <iostream>
#include <type_traits>

template <typename T>
concept has_static_meow = requires (T obj) {
    { decltype(obj)::meow() } -> std::same_as<void>;
};

template <typename T>
concept has_static_bark = requires (T obj) {
    { decltype(obj)::bark() } -> std::same_as<void>;
};

struct Dog { static void bark() { std::cout << "bark\n"; }};
struct Cat { static void meow() { std::cout << "meow\n"; } };

template<typename T>
struct MakeNoise {
    static void bark() requires has_static_bark<T> { T::bark(); }
    static void meow() requires has_static_meow<T> { T::meow(); }
};

int main() {
    MakeNoise<Dog>::bark();
    // MakeNoise<Dog>::meow(); // error with a nice error message
    MakeNoise<Cat>::meow();
    // MakeNoise<Cat>::bark(); // error with a nice error message
}