gla*_*des 2 c++ c++-concepts c++20
我对概念很陌生。据我了解,概念库列出了所有可用的标准概念。然而似乎没有什么像 std::decay 那样的东西?比较以下一般用例,我想将方法的输入限制为类专业化类型:
#include <type_traits>
#include <concepts>
template <typename T>
struct some_struct
{
template <typename U, typename = std::enable_if_t<std::is_same_v<std::decay_t<U>, T>>>
void do_something(U obj) {
return ;
}
};
int main()
{
some_struct<int> obj;
obj.do_something(0);
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能用概念来实现这一目标?
您可以添加一个概念,例如:
template <typename U, typename T>
concept DecaysTo = std::same_as<std::decay_t<U>, T>;
Run Code Online (Sandbox Code Playgroud)
这将允许:
template <DecaysTo<T> U>
void do_something(U&&);
Run Code Online (Sandbox Code Playgroud)
请注意,这仅在使用转发引用时才真正有意义。在原始示例中,参数类型为U,std::decay_t<U>只是U,因此DecaysTo<T>简化为std::same_as<T>。它仍然是正确的,只是不必要地参与。