2017-06-15 54 views
0

我使用std::string很多,但我使用的各種庫以const char*爲參數。我很疑惑std::string沒有轉換運算符到const char*。所以我正在尋找一些方法,無需在我的項目中始終調用c_str()自動將std :: string轉換爲char *而無需每次調用​​c_str()的最佳方法

有沒有辦法?

+4

調用'c_str()'時,* actual *的問題是什麼? –

+0

@JesperJuhl我想這只是代碼中的所有重複鍵入和混亂。儘管在查看大量模板化代碼時,C++是一種嘈雜冗長的語言。 – Barmar

+0

一種方法是爲這些函數編寫包裝,並在那裏調用'c_str'。你只需要每個功能一次,而不是每次使用一次。 – NathanOliver

回答

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); 

因此,我們在提高安全性和優雅的同時減少冗長。

2

這取決於你的代碼的結構?

使用範圍限定爲單塊

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

接受const char*所有功能都定位到接受const std::string,先從最常見的幾個模塊

寫的包裝。

相關問題