同じ入力データ型に対して異なるデータ型を返すAPIを処理するにはどうすればよいですか?
以下の例を見ると、apicall
入力属性に応じて日付または文字列を返す必要があります。
#include <iostream>
#include <string>
using namespace std;
???? apicall(string datatype, string attribute)
{
// code
}
int main(int argc, char** argv)
{
string datatype = "Thomas"
string attribute = "bithday"
cout << apicall(datatype, attribute) << endl;
string datatype = "Thomas"
string attribute = "address"
cout << apicall(datatype, attribute) << endl;
}
????
(apicall
return datatype)の代わりに何ができるでしょうか?また、これらのケースをどのように処理するのですか?
これまでの私の経験はduck typed
スクリプト言語であったため、私はこれらの概念を理解しようとしています。
理想的な解決策は、のstd::variant
ような安全な共用体タイプであるを使用することです。
これにより、次のように書くことができます。
using DateOrString = std::variant<DateType, std::string>;
DateOrString api_call(std::string, std::string) {
// you can return both DateType and std::string
}
// ...
auto result = api_call("", "");
auto& str = std::get<std::string>(result);
残念ながらstd::variant
、C ++ 17の機能です。ただし、さまざまなコンパイラがすでにサポートしています。
すでに提案されているようにboost
、variant
クラスがあり、任意のC ++標準で使用できます。
最後のオプションとして、日付と文字列の両方を処理する「バリアントのような」クラスを実装できます。関数はそれを返す必要があります。
ここに、その種のクラスをすばやく実装する方法のデモがあります。
型は実行時にチェックされるため、クラスは安全であることに注意してください。
バリアントオブジェクトとして、呼び出し先関数は次のように型で分岐する必要があります。
auto result = api_call(/*...*/);
if (result.is_string()) {
// result is a string
const auto& str = result.get_string();
} else {
// result is a date
const auto& date = result.get_date();
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加