提问人:Fureeish 提问时间:1/9/2023 更新时间:1/10/2023 访问量:86
用户可否参考推导式的推导?
Can a user refer to a deduced type of a deduction guide?
问:
std::basic_string
的演绎指南允许用户在不指定其模板参数的情况下使用名称。用户还可以创建自己的扣除指南。假设用户想要重新创建 。他们迟早会负责实施扣除指南。但是,cppreference 的注释让我想知道这是否可能。有问题的注释说:std::basic_string
std::basic_string
提供这些扣除指南是为了允许从 .(3)中的参数类型是指推导引板推导的类型的杆件类型。仅当 Alloc 满足 Allocator 时,这些重载才会参与重载解决。
std::basic_string
std::basic_string_view
size_type
size_type
强调我的。
用户能否实现这样的要求?程序员如何引用推导类型的别名?
答:
首先,请参阅有关用户定义的扣款指南的文档。
然后看看这个例子:
#include <iostream>
#include <string>
#include <vector>
template<typename T>
class Foo
{
public:
template<typename C>
Foo(C) {}
template<typename C>
Foo(C, typename C::size_type) {}
};
template<typename C>
Foo(C) -> Foo<typename C::value_type>;
template<typename C>
Foo(C, typename C::size_type) -> Foo<typename C::value_type>;
int main()
{
std::string s;
std::vector v{1, 3, 1};
Foo foo{s}; // Here Foo<char> is used
static_assert(std::is_same_v<Foo<char>, decltype(foo)>);
Foo bar{v};
Foo baz{v, 2};
static_assert(std::is_same_v<Foo<int>, decltype(bar)>);
static_assert(std::is_same_v<Foo<int>, decltype(baz)>);
}
https://godbolt.org/z/fsd6aMnY4
如您所见,类型用于引导实际所需的类型。
您可以使用更复杂的东西。C
Foo<typename C::value_type>
评论
Foo(C, Foo<typename C::value_type>::some_type) -> Foo<typename C::value_type>;
C::value_type
Foo<C>::value_type
Foo<C>
“由演绎指南推导的类型”只是右边的类型:->
template< class CharT,
class Traits,
class Alloc = std::allocator<CharT>> >
basic_string( std::basic_string_view<CharT, Traits>, typename basic_string<CharT, Traits, Alloc>::size_type,
typename basic_string<CharT, Traits, Alloc>::size_type, const Alloc& = Alloc() )
-> basic_string<CharT, Traits, Alloc>;
似乎它只是再次编写所有模板参数的简写,尤其是在推导出的类型会长得多的地方,例如 unordered_set<typename std::iterator_traits<InputIt>::value_type, std::hash<typename std::iterator_traits<InputIt>::value_type>, std::equal_to<typename std::iterator_traits<InputIt>::value_type>,Alloc>
。
上一个:在扣除指南中约束输入类型
评论
std
std::
std
std