Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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++_Templates_Variadic Templates_C++ Concepts - Fatal编程技术网

C++ C++;概念:一些签名函数转换

C++ C++;概念:一些签名函数转换,c++,templates,variadic-templates,c++-concepts,C++,Templates,Variadic Templates,C++ Concepts,不幸的是,我找到的关于concepts的唯一教程是conceptLite教程(它是非常基础的)。即使是技术规范,也有一些签名功能,我不知道如何翻译成概念(可能只是因为我的英语不好,我不能很好地阅读技术规范) 所以有一个签名函数列表,我仍然不知道如何“翻译”: CFoo-->类CFoo{} void Foo1()常量 CFoo&Foo2() voidfoo3(CFoo&) {static,friend,…}void Foo4() 模板 void Foo5(Args&…Args) 我想为具有这些

不幸的是,我找到的关于
concepts
的唯一教程是conceptLite教程(它是非常基础的)。即使是技术规范,也有一些签名功能,我不知道如何翻译成概念(可能只是因为我的英语不好,我不能很好地阅读技术规范)

所以有一个签名函数列表,我仍然不知道如何“翻译”:

CFoo-->类CFoo{}

  • void Foo1()常量
  • CFoo&Foo2()
  • voidfoo3(CFoo&)
  • {static,friend,…}void Foo4()
  • 模板
    void Foo5(Args&…Args)
我想为具有这些函数的类提供某种接口。 我甚至不知道在这一点上是否可能。Foo2和Foo3似乎是同一个问题


老实说,我真的很想知道Foo2和Foo5

我尝试了一些东西,为了食物2,但我对食物5一无所知:

class Handle {};

template < typename Object >
concept bool C_Object =
  requires(Handle handle) {
    {get(handle)} -> Object&
  };

template < C_Object Object >
class Foo {

  Object obj;
};

int main() {

  Foo<int>  test;
  return 0;
}
类句柄{};
模板
概念布尔C_对象=
需要(手柄){
{get(handle)}->Object&
};
模板
福班{
对象对象对象;
};
int main(){
Foo试验;
返回0;
}
我知道这不会编译,因为Foo没有get菜单,但这些错误不正确:

Test1.cpp:6:16: error: there are no arguments to ‘get’ that depend on a template parameter, so a declaration of ‘get’ must be available [-fpermissive]
     {get(handle)} -> Object&
                ^
Test1.cpp:6:16: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
Test1.cpp: In function ‘int main()’:
Test1.cpp:18:10: error: template constraint failure
   Foo<int>  test;
          ^
Test1.cpp:18:10: note:   constraints not satisfied
Test1.cpp:4:14: note: within ‘template<class Object> concept const bool C_Object<Object> [with Object = int]’
 concept bool C_Object =
              ^~~~~~~~
Test1.cpp:4:14: note:     with ‘Handle handle’
Test1.cpp:4:14: note: the required expression ‘get(handle)’ would be ill-formed
Test1.cpp:6:16:错误:没有依赖于模板参数的'get'参数,因此'get'声明必须可用[-fppermissive]
{get(handle)}->Object&
^
Test1.cpp:6:16:注意:(如果您使用'-fppermissive',G++将接受您的代码,但不赞成使用未声明的名称)
Test1.cpp:在函数“int main()”中:
Test1.cpp:18:10:错误:模板约束失败
Foo试验;
^
Test1.cpp:18:10:注意:约束未满足
Test1.cpp:4:14:注意:在“模板概念const bool C_Object[with Object=int]中”
概念布尔C_对象=
^~~~~~~~
Test1.cpp:4:14:注意:带有“Handle-Handle”
Test1.cpp:4:14:注意:所需的表达式“get(handle)”的格式可能不正确
如果有人能给我指出一些资源或者,为什么不能,一个解决方案。那太好了

祝你今天愉快

我知道这不会编译,因为Foo没有get-menber[…]

概念处理正规表达式。特别是,
requires
表达式的范围是普通范围,而不是类范围。这一概念可能更为明显:

template<typename Lhs, typename Rhs>
concept bool Addable = requires(Lhs lhs, Rhs rhs) {
    lhs + rhs;
};
然后,
client
附带了一个
Addable
约束,但是这个快捷方式本质上是语法的。这是一种减少样板文件的有用方法,即避免我们编写
模板需要可添加的

考虑到这一点,下面是一些可能接近于检查您提到的成员签名的表达式,以及
Handle
场景:

template<typename Obj>
concept bool Object = requires(Obj obj, Obj const cobj, Handle handle) {
    cobj.Foo1();
    { obj.Foo2() } -> Obj&;
    obj.Foo3(obj);
    // static
    Obj::Foo4();
    // non-member, possibly friend
    Foo4(obj);

    { obj.get(handle) } -> Obj&;
};
模板
concept bool Object=requires(对象对象、对象常量、句柄){
cobj.Foo1();
{obj.Foo2()}->obj&;
obj.Foo3(obj);
//静止的
Obj::Foo4();
//非会员,可能是朋友
Foo4(obj);
{obj.get(handle)}->obj&;
};
(我省略了
Foo5
场景,因为它值得提出自己的问题,下面是一个例子。)

我知道这不会编译,因为Foo没有get-menber[…]

概念处理正规表达式。特别是,
requires
表达式的范围是普通范围,而不是类范围。这一概念可能更为明显:

template<typename Lhs, typename Rhs>
concept bool Addable = requires(Lhs lhs, Rhs rhs) {
    lhs + rhs;
};
然后,
client
附带了一个
Addable
约束,但是这个快捷方式本质上是语法的。这是一种减少样板文件的有用方法,即避免我们编写
模板需要可添加的

考虑到这一点,下面是一些可能接近于检查您提到的成员签名的表达式,以及
Handle
场景:

template<typename Obj>
concept bool Object = requires(Obj obj, Obj const cobj, Handle handle) {
    cobj.Foo1();
    { obj.Foo2() } -> Obj&;
    obj.Foo3(obj);
    // static
    Obj::Foo4();
    // non-member, possibly friend
    Foo4(obj);

    { obj.get(handle) } -> Obj&;
};
模板
concept bool Object=requires(对象对象、对象常量、句柄){
cobj.Foo1();
{obj.Foo2()}->obj&;
obj.Foo3(obj);
//静止的
Obj::Foo4();
//非会员,可能是朋友
Foo4(obj);
{obj.get(handle)}->obj&;
};

(我省略了
Foo5
场景,因为它值得提出自己的问题,这里是一个。)

你是对的,我对概念和类别一无所知。谢谢。如果你认为Foo5太超出了范围,我会尝试一下,然后结束这个问题。你是对的,我对概念和类一无所知。谢谢。如果你认为Foo5太超出范围,我会尝试一下,然后结束这个问题。