每次都不调用c_str()而自动将std :: string转换为char *的最佳方法

时间:2017-06-15 16:38:13

标签: c++ stdstring

我经常使用std::string,但我使用的各种库都以const char*为参数。我很困惑std::string没有转化运算符const char*。所以我正在寻找一些方法来不必继续在我的项目中调用c_str()

有办法吗?

2 个答案:

答案 0 :(得分:4)

给出以下API接口:

namespace someapi {
    void foo(const char* pstr);
}

我们可以这样做:

namespace wrap_someapi
{
    inline decltype(auto) foo(const char* pstr) 
    { 
        return someapi::foo(pstr); 
    }

    inline decltype(auto) foo(std::string const& s)
    {
        return foo(s.c_str());
    }

    // or, in c++17

    inline decltype(auto) foo(std::string_view s)
    {
        return foo(s.c_str());
    }
}

现在在客户端代码中,而不是调用:

someapi::foo(s.c_str());
我们打电话给:

wrap_someapi::foo(s);

所以我们在提高安全性和优雅的同时失去了冗长。

答案 1 :(得分:2)

这取决于代码的结构?

使用范围限定为单个块

{
auto str=foo.c_str();
do_x(str);
do_y(str);
do_z(str);
//etc
}

接受const char*的所有函数都本地化为几个模块

编写接受const std::string的包装器,从最常见的包装器开始。