在函数声明中推导 shared_ptr T

Deduce shared_ptr T in function declaration

我想编写一个如下所示的函数:

template<class T>
void Foo(const std::shared_ptr<const T>& ptr);

这样我就可以这样称呼它了:

std::shared_ptr<int> ptr;
Foo(ptr);

但是,编译器无法推导出 T,我必须将其显式化:

Foo<int>(ptr);

或用 void Foo(const std::shared_ptr<T>& ptr).

重载它

我可以用 const T 声明 Foo 以便推导出 T 吗?

您的问题是 ptr 声明为 std::shared_ptr<int>,而 foo 需要 std::shared_ptr<const int>。您可以使用 const 限定符声明 ptr

std::shared_ptr<const int> ptr;
Foo(ptr);

或者从 foo 的声明中删除 const 限定符:

template<class T>
void Foo(const shared_ptr<T>& ptr);

或者,除非您真的需要在 foo 中知道您正在处理 shared_ptr,否则请使 foo 真正通用:

template<class T>
void Foo(const T& ptr);