【发布时间】:2023-03-09 14:03:02
【问题描述】:
有没有办法使模板推导与(隐式)转换一起工作?比如下面的例子:
template<typename T> struct A {};
template<typename T> struct B
{
B(A<T>); // implicit A->B conversion
};
template<typename... Ts> void fun(B<Ts>...);
int main()
{
A<int> a;
fun(B(a)); // works
fun(a); // does not work (deduction failure)
}
我的想法:
- 如果
A是B的子类,则一切正常。这意味着演绎可以使用向上转换进行隐式转换。所以它不能使用构造函数进行隐式转换似乎很奇怪。 - 原则上可以为
A和B重载fun,但对于多个参数,组合太多了 - 添加扣除指南 (
template<typename T> B(A<T>)->B<T>;) 不会改变任何内容。
编辑:一些上下文:
在我的实际代码中,A 是一个(大)容器,B 是一个轻量级的非拥有视图对象。这种情况类似于std::vector<T>在推演T时不能隐式转换为std::span<T>,即使对于任何具体的T,都存在这样的转换。
【问题讨论】:
标签: c++ templates implicit-conversion template-argument-deduction