【发布时间】:2019-08-08 14:28:05
【问题描述】:
我有一个带有隐式转换运算符的模板类thing,如下所示:
#include <stdio.h>
template <typename T>
struct thing
{
T t;
operator const T&() const
{
return t;
}
};
template <typename T>
struct B
{
T t;
};
void fun(const int&) {
printf("int\n");
}
template <typename T>
void fun(const B<T>&) {
printf("B<T>\n");
}
int main()
{
thing<int> a;
fun(a);
thing<B<int>> b;
fun(b);
return 0;
}
使用thing<int> 调用fun(const int&),编译器能够计算出调用隐式转换运算符,以便将const T&(在本例中为const int&)传递给fun(const int&)。
但是,对于thing<B<int>>,编译器无法确定我期望调用fun(const B<T>&)。
我如何帮助编译器解决这个问题不将b 显式转换为const B<int>&(例如使用static_cast<const B<int>&>(b))?
我的具体使用场景类似于我使用的约束提供的代码 B 有大约 10 种不同的类型 T,即不是任意的许多不同的 Ts。如果我必须创建约 10 个模板专业化,那就这样吧。但是,在这种情况下,我不完全知道如何最好地重载struct B。但也许我走错了路——可能存在更简单/更优雅的解决方案吗?
【问题讨论】:
-
你基本上不能,这不是模板的工作方式。他们不进行转换。