如何为std :: shared_ptr <PureVirtualClass>传递默认参数

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吗?

sky*_*ack 5

你可以简单地这样做:

virtual void foo(bla, bla, bla, std::shared_ptr<LoggerInterface> logger = {}) = 0;
Run Code Online (Sandbox Code Playgroud)

正如你在这里看到的,空构造函数和nullptr给出相同的结果,即:

构造一个没有托管对象的shared_ptr,即空shared_ptr


Chr*_*phe 3

使用 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。