2017-02-06 6 views
8

オプションのパラメータ:(。私はstd::optionalまでstd::experimental::optionalエイリアシングてる正式に利用可能である)関数呼び出し::私が署名され機能してい

void func(std::optional<std::string> os = std::nullopt); 

しかし、私がいる困難それをきれいに呼びます。コンパイラは、未処理のC文字列リテラルを使用して2つの暗黙的な変換(const char*std::stringstd::optional<std::string>)を呼び出すことを拒否します。私はこれを行うことができます:

func(std::string("Hello")); 

とコンパイラはstd::optionalが必要であることを理解し、変換を行います。しかし、これはあまりにも冗長です。 C++ 11のおかげで、私もこれを行うことができます。これはずっといいですが

func({"Hello"}); 

を、それはまだ理想的ではありません。私はstd::stringを取る他のどのようなこの関数を呼び出すことができるようにしたいと思います。 これは可能ですか?関数を別のパラメータ型にすることは、/と同様に動作するかぎり、直接std::optionalに変換できる限り、大丈夫です。ありがとう。

+1

パラメータと 'のstd :: STRING'パラメータなしで、単に機能をオーバーロードして何が悪いのでしょうか? –

+0

@SamVarshavchik私の知る限りでは、大規模な複製を避けるために3つのオーバーロードが必要になるでしょう:void func(std :: optional os = std :: nullopt) '、' void func(std :: string s) ' 'void func()'。後者の2つは前者を呼び出し、必要に応じてオプションのものを作成します。あなたが私を間違っていると証明できれば嬉しいです。これは技術的には機能しますが、不必要なインターフェイスコードがたくさんあります。しかし、ありがとう。 – ThatsJustCheesy

+1

さて、 'func(" std :: string literal "s);'大丈夫ですか? – DeiDei

答えて

8

C++ 14では、コードをあまり冗長にしないために、標準ライブラリにユーザー定義のリテラルを追加しています。

using namespace std::string_literals;    // needed 
// using namespace std::literals;     // also ok, but unnecessary 
// using namespace std::literals::string_literals; // also ok, but why?? 

int main() 
{ 
    std::string str = "string"s; 
         ^^^^^^^^ 
         // This is a std::string literal, 
         // so std::string's copy constructor is called in this case 
} 

また、参照用thisthisを見てみましょう:それは次のようになります。

5

あなたがテンプレートとsfinaeのビットであることを行うことができます。

template<typename T, std::enable_if_t< 
    std::is_constructible<std::string, T>::value && 
    !std::is_constructible<std::optional<std::string>, T>::value>* = nullptr> 
void func(T&& s) { 
    void func(std::string(std::forward<T>(s))); 
} 

を文字列が転送Tで構築可能になるときこのオーバーロードが選択されますが、std::optional<std::string>が構築可能でない場合のみです。あなたが機能

が文字列で構成することができることを任意のオブジェクトで呼び出し可能になります。

func("potato"); // working, forward the string literal to a std::string 
+0

エンドユーザーにとって使いやすいようなライブラリを作成していた場合は、このアプローチを使用する可能性があります。もう一つの答えは私の場合には良いですが、これは素晴らしい選択肢です。本当にありがとう。 – ThatsJustCheesy

関連する問題