gpt4 book ai didi

c++ - 在隐式参数转换中使用演绎指南

转载 作者:搜寻专家 更新时间:2023-10-31 01:29:50 25 4
gpt4 key购买 nike

考虑以下类型定义的模拟:

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(偏移量的性质并不那么重要)。它还提供了一个推导指南,从 Foooffset = 0FooView

现在,考虑一下它是如何使用的:

Foo<float> foo;
// yada(foo); // <-- error: no matching function for call to 'yada'
yada(FooView{foo});

我本以为隐式构造函数与演绎指南配对就足以使注释调用工作,但实际上我必须输入转换。我能以某种方式使它隐式转换吗?

我试过在 Foo 中引入隐式转换运算符,如下所示:

operator FooView<T, 0>() { return FooView{*this}; }

但无济于事。编译器仍然会抛出相同的错误。

最佳答案

类模板参数推导仅适用于 certain situations ,它们都需要使用实际的类模板占位符。 arg 不会触发推导,只有 cls(arg) 会。

yada(foo) 只是遵循重载决议的正常规则,因为 foo 不是 FooView(模板推导不会考虑转换),重载解析失败。

yada(FooView(foo)) 执行类模板参数推导因为您要求。这始终是一个明确的按需功能。

关于c++ - 在隐式参数转换中使用演绎指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49175701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com