C++ 概念:一些签名函数转换
C++ concepts: Some signatures function conversion
不幸的是,我找到的关于 concepts
的唯一教程是概念精简版教程(它真的很基础)。而且即使有了技术规范,也有一些我不知道如何转化为概念的签名功能(可能只是因为我的英语不好,我不能很好地阅读技术规范).
所以有一个签名列表功能我仍然不知道如何“翻译”:
CFoo --> class CFoo {};
void Foo1() const;
CFoo& Foo2();
void Foo3(CFoo&);
{static, friend, ... } void Foo4();
template < typename ... Args >
void Foo5(Args && ... args);
我想为具有这些功能的 class 提供某种界面。
甚至不知道在这一点上是否有可能。 Foo2和Foo3好像是同一个问题
老实说,我真的很想知道 Foo2 和 Foo5。
我为 Foo2 尝试了一些东西,但我对 Foo5 没有任何想法:
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;
}
我知道这不会编译,因为 Foo 没有 get menber,但这些不是正确的错误:
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
如果有人能指出一些资源或者,为什么不,一个解决方案。会很棒的。
祝你有美好的一天
I know this won't compile because Foo don't have a get menber […]
概念处理普通表达式。特别是,requires
表达式的范围是正常范围,而不是 class 范围。这个概念可能更明显:
template<typename Lhs, typename Rhs>
concept bool Addable = requires(Lhs lhs, Rhs rhs) {
lhs + rhs;
};
Addable<int, long>
得到满足,因为给定 int lhs; long rhs;
那么 lhs + rhs
是一个有效的表达式。我们在参数列表中显式引入的两个(假装)变量上使用内置加法运算符,而不是在隐式 *this
.
上调用成员 operator+
概念是关于更广泛意义上的接口(如 'API'),而不是狭义的 OOP 意义上的。您可以将 Addable
视为类型对的关系。 Addable<int, long>
成立并不意味着 int
本身与 Addable
有特殊关系。 Addable
确实可以用作
template<Addable<long> Var>
struct client {
Var var;
};
然后 client<int>
带有 Addable<int, long>
约束,但这个快捷方式本质上是语法上的。这是减少样板文件的有用方法,即让我们免于编写 template<typename Var> requires Addable<Var, long>
.
考虑到这一点,这里有一些表达式可能接近检查您提到的成员签名,加上 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&;
};
(我省略了 Foo5
场景,因为它值得自己提问,这里是 lead。)
不幸的是,我找到的关于 concepts
的唯一教程是概念精简版教程(它真的很基础)。而且即使有了技术规范,也有一些我不知道如何转化为概念的签名功能(可能只是因为我的英语不好,我不能很好地阅读技术规范).
所以有一个签名列表功能我仍然不知道如何“翻译”:
CFoo --> class CFoo {};
void Foo1() const;
CFoo& Foo2();
void Foo3(CFoo&);
{static, friend, ... } void Foo4();
template < typename ... Args > void Foo5(Args && ... args);
我想为具有这些功能的 class 提供某种界面。 甚至不知道在这一点上是否有可能。 Foo2和Foo3好像是同一个问题
老实说,我真的很想知道 Foo2 和 Foo5。
我为 Foo2 尝试了一些东西,但我对 Foo5 没有任何想法:
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;
}
我知道这不会编译,因为 Foo 没有 get menber,但这些不是正确的错误:
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
如果有人能指出一些资源或者,为什么不,一个解决方案。会很棒的。
祝你有美好的一天
I know this won't compile because Foo don't have a get menber […]
概念处理普通表达式。特别是,requires
表达式的范围是正常范围,而不是 class 范围。这个概念可能更明显:
template<typename Lhs, typename Rhs>
concept bool Addable = requires(Lhs lhs, Rhs rhs) {
lhs + rhs;
};
Addable<int, long>
得到满足,因为给定 int lhs; long rhs;
那么 lhs + rhs
是一个有效的表达式。我们在参数列表中显式引入的两个(假装)变量上使用内置加法运算符,而不是在隐式 *this
.
operator+
概念是关于更广泛意义上的接口(如 'API'),而不是狭义的 OOP 意义上的。您可以将 Addable
视为类型对的关系。 Addable<int, long>
成立并不意味着 int
本身与 Addable
有特殊关系。 Addable
确实可以用作
template<Addable<long> Var>
struct client {
Var var;
};
然后 client<int>
带有 Addable<int, long>
约束,但这个快捷方式本质上是语法上的。这是减少样板文件的有用方法,即让我们免于编写 template<typename Var> requires Addable<Var, long>
.
考虑到这一点,这里有一些表达式可能接近检查您提到的成员签名,加上 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&;
};
(我省略了 Foo5
场景,因为它值得自己提问,这里是 lead。)