隐式转换为模板结构?

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
} 

fFoo 的一个定义明确的实例,所以显然它有效。但是既然 3 可以(隐含地,我相信)转换为 Foo,为什么 print(3); 不起作用?

如果不是隐式转换,怎么实现?

我真的很想避免print(Foo(3));

隐式转换(从intFoo<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