隐式转换为模板结构?
Implicit conversion to templated struct?
template <typename T>
struct Foo {
T var;
Foo (const T& val){
var = val;
}
};
template <typename T>
void print(Foo<T> func){}
int main() {
Foo f=3;
print(f); // Works
print(3); // Doesn't work
}
f
是 Foo
的一个定义明确的实例,所以显然它有效。但是既然 3 可以(隐含地,我相信)转换为 Foo
,为什么 print(3);
不起作用?
如果不是隐式转换,怎么实现?
我真的很想避免print(Foo(3));
隐式转换(从int
到Foo<int>
)在模板参数推导中不会被考虑,模板参数T
无法推导,然后调用失败。
除了print(Foo(3));
,您还可以明确指定模板参数以绕过模板参数推导,例如
print<int>(3);
模板参数推导不会考虑隐式转换。要获得所需的调用语法,您可以像这样
添加 print
的重载
template <typename T>
void print(T a) // selected if T is not a Foo specialization
{
print(Foo{a}); // call print with a Foo explicitly
}
如果 print
的参数已经是 Foo
的特化,将选择采用 Foo<T>
的重载。
这里是 demo。
template <typename T>
struct Foo {
T var;
Foo (const T& val){
var = val;
}
};
template <typename T>
void print(Foo<T> func){}
int main() {
Foo f=3;
print(f); // Works
print(3); // Doesn't work
}
f
是 Foo
的一个定义明确的实例,所以显然它有效。但是既然 3 可以(隐含地,我相信)转换为 Foo
,为什么 print(3);
不起作用?
如果不是隐式转换,怎么实现?
我真的很想避免print(Foo(3));
隐式转换(从int
到Foo<int>
)在模板参数推导中不会被考虑,模板参数T
无法推导,然后调用失败。
除了print(Foo(3));
,您还可以明确指定模板参数以绕过模板参数推导,例如
print<int>(3);
模板参数推导不会考虑隐式转换。要获得所需的调用语法,您可以像这样
添加print
的重载
template <typename T>
void print(T a) // selected if T is not a Foo specialization
{
print(Foo{a}); // call print with a Foo explicitly
}
如果 print
的参数已经是 Foo
的特化,将选择采用 Foo<T>
的重载。
这里是 demo。