在函数声明中推导shared_ptr T

Deduce shared_ptr T in function declaration

本文关键字:shared ptr 函数 声明      更新时间:2023-10-16

我想写一个这样的函数:

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)过载。

我可以有一个单一的声明Fooconst T,以便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);