首页 > 解决方案 > 带有自定义类的共享指针语法背后的任何原因,模板如下

问题描述

我目前在项目中看到了一些 c++11 代码,我对一些时髦的语法有点困惑。

下面是代码

std::shared_ptr<CommonAPI::Runtime> runtime_AMB = CommonAPI::Runtime::get();
std::shared_ptr<v1::org::table::psa::EthernetProxy<>> amb_consumer ;
amb_consumer = runtime_AMB->buildProxy<v1::org::table::psa::EthernetProxy>();

这里我怀疑的是“buildProxy”功能,可以简单地称为为什么它提到

buildProxy<v1::org::table::psa::EthernetProxy>()代替buildProxy()

还有一个疑问是 shared_ptr<v1::org::table::psa::EthernetProxy<>>这里为什么EthernetProxy<>相反v1::org::table::psa::EthernetProxy

可能很容易,但我不太了解 c++11

标签: c++c++11

解决方案


回答第一个问题

说你有:

struct Foo
{
    template <typeename T>
    T bar() { return T{}; }

    template <typeename T>
    T baz(T t) { return 2*t; }
};

要使用Foo::bar,您需要提供模板参数。

Foo foo;
foo.bar<int>(); // OK.
foo.bar();      // Not OK.

如果模板参数可以从参数中推导出来,那么您不需要显式指定模板参数。

foo.baz<int>(10); // OK. Template parameter is explicity.
foo.bar(10);      // Also OK. Template parameter is deduced to be int

回答第二个问题

EthernetProxy似乎是一个带有默认模板参数的类模板。说你有:

template <typename T = int> struct EthernetProxy { ... };

EthernetProxy不是一个类,它是一个类模板。类模板的实例化将是一个类。

EthernetProxy<double> var1; // OK
EthernetProxy<> var2;       // Also OK. The default template parameter int is used.

这就是为什么您可以EthernetProxy<>用作类型但不能用作EthernetProxy.


推荐阅读