c++ - 带有自定义类的共享指针语法背后的任何原因,模板如下
问题描述
我目前在项目中看到了一些 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
解决方案
回答第一个问题
说你有:
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
.
推荐阅读
- ruby-on-rails - 在 Rails 中创建新用户时,我不断收到“密码不能为空”错误
- windows - 如何打开 postgres 命令行?
- javascript - Jquery vs Javascript设置一个html隐藏的布尔字段
- php - Codeigniter 中的 URI 路由和参数
- react-native - 如何在包 react-native-cookie 中按名称删除 cookie
- javascript - 开玩笑将对象与任意属性值进行比较
- reactjs - 在单独的组件中定义路由 - React
- javascript - 你如何将属性发送到 svg 中的 javascript 函数
- google-maps - 谷歌地图如何知道某些道路是单向/双向?
- angular - Angular 6,无法将组件导入routing.module