15

私は C++14 用の JSON ライブラリを作成しており、可能な限り移動セマンティクスを利用しようとしています。

Valueのクラスには、可能な場合は常に移動しようとするセッターとゲッターがいくつかあります。

template<class T> void setObj(T&& x)  { type = Obj; hObj.init(forward<T>(x)); } 
template<class T> void setArr(T&& x)  { type = Arr; hArr.init(forward<T>(x)); }
template<class T> void setStr(T&& x)  { type = Str; hStr.init(forward<T>(x)); }

auto& getObj() & noexcept             { assert(is<Obj>()); return hObj; }
auto& getArr() & noexcept             { assert(is<Arr>()); return hArr; }
auto& getStr() & noexcept             { assert(is<Str>()); return hStr; }
const auto& getObj() const& noexcept  { assert(is<Obj>()); return hObj; }
const auto& getArr() const& noexcept  { assert(is<Arr>()); return hArr; }
const auto& getStr() const& noexcept  { assert(is<Str>()); return hStr; }
auto getObj() && noexcept             { assert(is<Obj>()); return move(hObj); }
auto getArr() && noexcept             { assert(is<Arr>()); return move(hArr); }
auto getStr() && noexcept             { assert(is<Str>()); return move(hStr); }

コードからわかるように、完全な転送セッター関数は、テンプレートとユニバーサル参照を使用して非常に簡単に作成できます。

ゲッター関数で同じことを行うにはどうすればよいですか? テンプレートの戻り値の型を使用する必要があることは確かですが、ref-qualifiers と const-correctness を複製する方法がわかりません。

4

2 に答える 2

4

ref qualifiers と member constness をテンプレート化できないため、残念ながらそれはできません。それらを書き出す必要があります。

于 2014-09-29T12:46:12.620 に答える