Eri*_*mov 8 c++ shared-ptr default-parameters c++11
我有类型的功能
virtual void foo(bla, bla, bla, std::shared_ptr<LoggerInterface> logger) = 0;
Run Code Online (Sandbox Code Playgroud)
我想用NULL指针传递一个默认参数,如:
virtual void foo(bla, bla, bla, std::shared_ptr<LoggerInterface> logger = NULL) = 0;
Run Code Online (Sandbox Code Playgroud)
所以在实现中,如果logger是NULL
我什么都不做,否则我使用记录器.
我试图找一个解决方案,但找不到..
UPD:重复声明是无关紧要的,我问的是默认的NULL参数.
gcc 4.4有可能不支持nullptr吗?
你可以简单地这样做:
virtual void foo(bla, bla, bla, std::shared_ptr<LoggerInterface> logger = {}) = 0;
Run Code Online (Sandbox Code Playgroud)
正如你在这里看到的,空构造函数和nullptr
给出相同的结果,即:
构造一个没有托管对象的shared_ptr,即空shared_ptr
使用 C++11 兼容的编译器
这应该适用于C++ 的推荐形式,NULL
或者后者。nullptr
唯一的条件是您将其编译为 c++11 或更高版本(请参阅 jamek 关于 gcc 命令行选项的评论)。
struct B {
virtual void foo(int blablabla, std::shared_ptr<LoggerInterface> logger = nullptr) = 0;
};
struct D : B {
void foo(int blablabla, std::shared_ptr<LoggerInterface> logger) override {
std::cout << "foo: "<<blablabla<<" "<< logger<<std::endl;
}
};
int main() {
D d;
B *b=&d;
b->foo(15);
}
Run Code Online (Sandbox Code Playgroud)
查看在线演示
关于默认参数的重要说明
请注意,默认参数不是函数本身固有的,而是声明默认值的上下文所固有的。在上面的例子中:
b->foo(15)
有效,因为该函数是使用B
定义了默认参数的类来访问的。 d.foo(15)
尽管两者都引用相同的函数,但甚至无法编译。这是因为对于该类D
,我没有在覆盖的定义中声明默认值。 GCC 4.4 中 C++11 的有限实现
事实上,nullptr
它是随 GCC 4.6 引入的,您必须等待 GCC 4.8.1 才能获得完整的 C++11 实现。
事实上,GCC 4.4.0于 2009 年发布, 2011 年 8 月标准正式批准后的第一个子版本是 GCC 4.4.7。
归档时间: |
|
查看次数: |
4441 次 |
最近记录: |