隐式调用复制构造函数

Roe*_*oel 5 c++

考虑:

struct Foo
{
    Foo(std::string str) {}
};

struct Bar
{
    Bar(Foo f) {}
};

int main(int argc, char* argv[])
{
    Foo f("test");

    Bar b1(f);
    Bar b2(std::string("test"));
    Bar b3("test");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这无法在b3的声明上编译('不能将参数1从'const char [5]'转换为'Foo'').这是有道理的,因为没有直接的方法将const char转换为Foo.但是,有一种方法可以将const char转换为std :: string,然后使用它来构造一个Foo(这是b1和b2中发生的事情),这就是我想要的,因为它使API更好使用(不必每次都显式地实例化Foo或std :: string).

所以我的问题是:有没有办法让编译器隐式调用Foo(std :: string)复制构造函数?换句话说,有没有办法像b3那样进行声明工作,让它与b2相同,并且不为foo声明一个const char*copy构造函数?(最后一件事情是显而易见的,但我真正的代码当然不是那么简单,我宁愿不必添加const char*copy构造函数并正确处理构造函数中的所有其他初始化并将其保留在与std :: string复制构造函数同步).

Tar*_*ama 8

如果c ++ 11是可接受的,你可以添加一个委托构造函数来Foo获取a const char*并只调用另一个构造函数:

struct Foo
{
    Foo(std::string str) {}
    Foo(const char* str) : Foo(std::string(str)) {}
};
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用c ++ 14的std::string文字:

using namespace::std::string_literals;
Bar b3("test"s);
Run Code Online (Sandbox Code Playgroud)

您还可以通过让两个构造函数调用单独的函数来模拟委托构造函数:

struct Foo
{
    Foo(std::string str) { init(str); }
    Foo(const char* str) { init(str); }
    void init(std::string str) {}
};
Run Code Online (Sandbox Code Playgroud)

上面的缺点是你需要仔细考虑你在初始化列表中所做的任何事情,你现在需要做的事情init.


Gan*_*zy' 1

改变这个怎么样:

struct Bar
{
    Bar(Foo f) {}
};
Run Code Online (Sandbox Code Playgroud)

struct Bar
{
    Bar(Foo f) {}
    Bar(std::string f) {}
};
Run Code Online (Sandbox Code Playgroud)

使用多态性...

  • 多态性(通常意义上的 OOP)与此无关,它只是重载。 (5认同)