【问题标题】:Deduce shared_ptr T in function declaration在函数声明中推导出 shared_ptr T
【发布时间】:2017-02-13 18:49:36
【问题描述】:

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

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&lt;T&gt;&amp; ptr)重载它。

我可以有一个声明 Fooconst T 以便推导出 T 吗?

【问题讨论】:

  • 共享指针被设计为被复制——通过引用传递它们通常是个坏主意
  • @UKMonkey 不完全正确。见这里stackoverflow.com/questions/3310737/…
  • @Hayt 很公平 - 正如那里所说,这是选项问题。我就点点头就回去睡觉了。
  • @UKMonkey 这就是为什么我没有说你错了;)在这个话题上并不是非黑即白

标签: c++ templates c++11 shared-ptr


【解决方案1】:

您的问题是ptr 被声明为std::shared_ptr&lt;int&gt;foo 需要std::shared_ptr&lt;const int&gt;。要么使用 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);

【讨论】:

    猜你喜欢
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    相关资源
    最近更新 更多