私が今日取り組もうとしている問題は、参照を返したいところですが、実際には何か「空の」ものを返すため、実際にはできません。「空の」オブジェクトへの参照を返す方法
std::array<std::string, 5> cStrings /* do something to init */
const std::string& get_my_string(/* args */) {
if(i_know_what_to_return()) {
/*
* returning happily something in
* cStrings if I know what
*/
} else {
/* oeps... i need to return something, I don't have :-(*/
return std::string(); // DON'T TRY THIS AT HOME!
}
}
オブジェクトのコピーを返す開始し、さらに悪いことに、あらゆる場所に空のオブジェクトの作成を避けるため、またはするための一般的なアプローチが存在しない場合、私は思っていた:ただ、このような何かを明確にします。だから私は私のためにこれを管理するためにコンパイラに伝えることができる何らかの種類のテンプレートクラスを作成できないのだろうかと思っていました。これは、(テンプレート宣言でバラツキの少ないこのすべてがエラーを生成するので、多くのその一つだけが)
template<typename T, decltype(T) V>
struct empty_reference {
using type = T;
static const T static_object_;
operator T&() const {
return static_object_;
}
};
template<typename T, decltype(T) V>
const typename empty_reference<T, V>::type
empty_reference<T, V>::static_object_ = V;
残念ながら、これは動作しません(私は「decltype(T上のエラーを取得する私のアプローチでした)Vは 'decltypeは式が型ではないと期待している'と言っていますが、これは主にテンプレート宣言に何かがないためです。私は、だから私はここに3つの質問を持って
return empty_reference<std::string, std::string()>();
を返すことによって、このクラスを使用することを期待しています最後に 。
- これは私がこの仕事を作るのですか、私はまだ、コンパイル時に評価されながらVはタイプTである必要があり、コンパイラに伝えるために「decltype(T)V」をどのように有効にする方法
- 可能だろうか?
- これは良いアプローチか、この問題のより簡単な解決策ですか?
あなたは 'std :: optional'(C++ 17)またはboost.optionalを探しています。 –
"Nullable reference"は "ポインタ"とよく似ていますか? – BoBTFish
@BaummitAugen私は 'optional'を提案しようとしていましたが、参照を含めることはできますか? – BoBTFish