我想要一个concept需要任意向量作为返回类型:
template<typename T>
concept HasVector = requires (T t) {
{ T.vec() } -> std::same_as<std::vector<int>>; //works
{ T.vec() } -> std::same_as<std::vector<foo>>; //want to put something arbitrary in here
}
Run Code Online (Sandbox Code Playgroud)
这样我们就会有如下内容:
class A {
std::vector<int> vec() { /* ... */}
}
class B {
std::vector<double> vec() { /* ... */}
}
static_assert(HasVector<A>);
static_assert(HasVector<B>);
Run Code Online (Sandbox Code Playgroud)
此外,要求一个向量作为返回类型会更好,其值类型满足其他一些概念,即
template<typename T>
concept Arithmetic = // as in the standard
template<typename T>
concept HasArithmeticVector = requires (T t ) {
{ T. vec() } -> …Run Code Online (Sandbox Code Playgroud) 有了概念,C++20提供了很好的语法,比如
template<typename T>
concept SomeConcept = true; // stuff here
template<typename T>
requires SomeConcept<T>
class Foo;
template<SomeConcept T>
class Foo;
Run Code Online (Sandbox Code Playgroud)
其中限制类的两种概念方式是等效的,但后者更简洁。
如果我现在有一些模板模板概念,例如
template<template<typename> typename T>
concept SomeOtherConcept = true; // stuff here
template<template<typename> typename T>
requires SomeOtherConcept<T>
class Foo;
Run Code Online (Sandbox Code Playgroud)
我不知道没有要求子句的非详细(简洁/简短)语法,例如
template<template<typename> SomeotherConcept T>
class Foo;
template<template<SomeOtherConcept> typename T>
class Foo;
Run Code Online (Sandbox Code Playgroud)
没有用,所以
声明这样一个模板模板类的正确语法是什么,对模板模板参数有概念限制?