提问人:ctejeda 提问时间:9/5/2022 更新时间:9/5/2022 访问量:52
如何在包含静态 constexPR 的类型的概念要求中指定返回类型?
how to specify the return type in a requirement for a concept for types that contains a static constexpr?
问:
这个问题与以下问题非常相似: C++概念:要求在策略类中存在静态变量,但解决方案对我不起作用。 我的例子如下:
#include <iostream>
template<typename T1>
concept AConcept = requires(T1 a)
{
// { a.typef }; // without requiring the return type it works.
{ a.typef } -> std::same_as<char>; // not working with char& either.
};
struct Aclass{
static constexpr char typef='c';
char getVal(){ return typef; };
};
char getVal( AConcept auto kk ){
return kk.getVal();
};
int main(){
Aclass u;
char c = getVal( u );
std::cout << c << std::endl;
return 0;
};
并且编译失败,因为未满足概念要求。
(g++ 11.2.0,编译 g++ -std=c++20 kk.cpp -o kk
)
先谢谢你,
答:
2赞
Bernd
9/5/2022
#1
你可以写:
#include <iostream>
#include <type_traits>
template<typename T1>
concept AConcept = std::is_same_v<decltype(std::declval<T1>().typef ), const char>;
struct Aclass{
static constexpr char typef ='c';
char getVal(){ return typef; };
};
char getVal( AConcept auto kk ){
return kk.getVal();
};
int main(){
Aclass u;
char c = getVal( u );
std::cout << c << std::endl;
return 0;
};
或者,如果您不关心 l 值引用,您可以像这样定义概念:
template<typename T1>
concept AConcept = requires(T1 a)
{
{ a.typef } -> std::same_as<const char&>;
};
看看 https://en.cppreference.com/w/cpp/language/requires。
字段访问表达式的类型为 - 它与:相同。const char&
decltype((expression))
看一看: https://en.cppreference.com/w/cpp/language/decltype 这里重要的部分是实体的和周围,这使它成为一个表达式......(
)
评论
0赞
ctejeda
9/6/2022
谢谢,我已经尝试过 std::is_same...::value 方法,但我没有看到 declval 的必要性。我仍然不知道为什么 decltype( T1::typef ) 在is_same_v模板中无效,并且需要 declval。
0赞
Bernd
9/7/2022
哦,decltype(T1::typef) 也是有效的。如果要强制使用静态字段,则更加有效。请参阅:godbolt.org/z/Wa5PErs6a 你能给我看一下失败的代码吗?
评论