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和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太超出范围,我会尝试一下,然后结束这个问题。