作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我能否在概念的 C++20 约束中使用受约束的泛型类型?例如,假设我想写一个要求,候选类 T
有一个函数 func
,它可以接受满足 std 的任何类型的参数::范围::范围
:
template<typename T>
concept Foo = requires (T t, std::ranges:range s) {
{ t.func(a); } -> std::convertible_to<double>;
}
但是 GCC 给我一条错误消息,指出不能在我放置 std::ranges::range
的地方使用占位符类型。
最佳答案
在我看来,您正在寻找一个带有(仅声明的)operator T ()
的结构,用于通用 T
struct generic_argument
{
template <typename T>
operator T () const;
};
因此您可以为每个预期参数和模板参数传递它(在 decltype()
中)。
所以你的概念(抱歉......我简化了它删除了范围参数)变成了(如果我明白你想要什么)
template<typename T>
concept Foo
= std::convertible_to<decltype(std::declval<T>().func(std::declval<generic_argument>())),
double>;
下面是一个完整的编译示例
#include <iostream>
struct A { double func (int a) { return a; } };
struct B { double not_func (long a) { return a; } };
struct C { std::string func (char) { return "abc"; } };
struct D { float func (auto) { return 1.0f; } };
struct E { double func (int a) { return a; }
std::string func (char) { return "abc"; } };
struct generic_argument
{
template <typename T>
operator T () const;
};
template<typename T>
concept Foo
= std::convertible_to<decltype(std::declval<T>().func(std::declval<generic_argument>())),
double>;
template <Foo T>
void bar (T const &)
{ std::cout << "bar, Foo version\n"; }
template <typename T>
void bar (T const &)
{ std::cout << "bar, generic version\n"; }
int main()
{
bar(A{}); // print bar, Foo version
bar(B{}); // print bar, generic version [no func() function]
bar(C{}); // print bar, generic version [no convertible to double]
bar(D{}); // print bar, Foo version
bar(E{}); // print bar, generic version [two func() function]
}
我对 E
的情况有疑问:两个 func()
方法,一个只返回一个可转换为 double
的类型,来自bar(E{})
我们得到“bar, generic version”。
关于c++ - 不受约束的 requires-expression 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66994909/
考虑一个相关矩阵 r,表示变量 1 到 10 之间的相关性: r thr)) NA else sum(score[x]) }) min(summed_score, na.rm=T) ## [1] 1
我在 firebase 中有一个值需要增加,它受竞争条件的影响,所以我更愿意一次完成所有这些。 node: { clicks: 3 } 我需要设置 clicks = cli
我是一名优秀的程序员,十分优秀!