在隐式参数转换中使用演绎指南
Use deductions guides in implicit argument conversion
考虑以下模拟类型定义:
template<typename T> struct Foo {};
template<typename T, size_t offset>
struct FooView {
FooView(const Foo<T>&) {}
};
template<typename T> FooView(const Foo<T>&) -> FooView<T, 0>;
template<typename T, size_t s>
void yada(FooView<T, s> arg) {}
正如你所看到的,我们有一个类型 Foo
,这里代表事物的集合 T
和一个类型 FooView
代表 Foo 的视图,以及一些偏移量 s
(偏移量的性质并不那么重要)。它还提供了推导指南,从 Foo
到 FooView
和 offset = 0
。
现在,考虑一下它是如何使用的:
Foo<float> foo;
// yada(foo); // <-- error: no matching function for call to 'yada'
yada(FooView{foo});
我本以为隐式构造函数与演绎指南配对就足以使注释调用起作用,但实际上我必须键入转换。我能以某种方式使它隐式转换吗?
我试过在 Foo
中引入隐式转换运算符,如下所示:
operator FooView<T, 0>() { return FooView{*this}; }
但无济于事。编译器仍然抛出相同的错误。
Class 模板参数推导仅适用于 certain situations,它们都需要使用实际的 class 模板占位符。 arg
不会触发扣除,只有 cls(arg)
会触发。
yada(foo)
只是遵循重载解析的正常规则,并且由于 foo
不是 FooView
(模板推导不考虑转换),重载解析失败。
yada(FooView(foo))
执行 class 模板参数推导 因为你要求它 。这始终是一个明确的 on-demand 功能。
考虑以下模拟类型定义:
template<typename T> struct Foo {};
template<typename T, size_t offset>
struct FooView {
FooView(const Foo<T>&) {}
};
template<typename T> FooView(const Foo<T>&) -> FooView<T, 0>;
template<typename T, size_t s>
void yada(FooView<T, s> arg) {}
正如你所看到的,我们有一个类型 Foo
,这里代表事物的集合 T
和一个类型 FooView
代表 Foo 的视图,以及一些偏移量 s
(偏移量的性质并不那么重要)。它还提供了推导指南,从 Foo
到 FooView
和 offset = 0
。
现在,考虑一下它是如何使用的:
Foo<float> foo;
// yada(foo); // <-- error: no matching function for call to 'yada'
yada(FooView{foo});
我本以为隐式构造函数与演绎指南配对就足以使注释调用起作用,但实际上我必须键入转换。我能以某种方式使它隐式转换吗?
我试过在 Foo
中引入隐式转换运算符,如下所示:
operator FooView<T, 0>() { return FooView{*this}; }
但无济于事。编译器仍然抛出相同的错误。
Class 模板参数推导仅适用于 certain situations,它们都需要使用实际的 class 模板占位符。 arg
不会触发扣除,只有 cls(arg)
会触发。
yada(foo)
只是遵循重载解析的正常规则,并且由于 foo
不是 FooView
(模板推导不考虑转换),重载解析失败。
yada(FooView(foo))
执行 class 模板参数推导 因为你要求它 。这始终是一个明确的 on-demand 功能。