1

私は、参照を取得することが賢明ではない場合 (一時的なものなど) に、参照、または適切にコピーまたは移動された値のstd::tupleいずれかを保持することになる を作成しようとしています。const

これまでのところ、私は持っています:

#include <functional>
#include <iostream>

template <typename ...Args>
struct foo {
  const std::tuple<Args...> values;
};

template <typename T1, typename T2>
foo<T1, T2> make2(T1&& v1, T2&& v2) {
  return foo<T1,T2>{std::tuple<T1, T2>(std::forward<T1>(v1),std::forward<T2>(v2))};
}

int main() {
  double d1=1000;
  double& d2 = d1;
  auto f = make2(d2, 0);
  std::cout << std::get<0>(f.values) << ", " << std::get<1>(f.values) << "\n";
  d1 = -666;
  std::get<0>(f.values)=0; // Allowed - how can I inject some more constness into references?
  //std::get<1>(f.values) = -1; // Prohibited because values is const
  std::cout << std::get<0>(f.values) << ", " << std::get<1>(f.values) << "\n";
}

これは近いですが、const私が望んでいたものには十分ではありません-const std::tuple<double&, int>もちろん、タプルが参照する double を変更できるようになります。

const私はもう少しネスを振りかけてみましたmake2

template <typename T1, typename T2>
foo<T1 const, T2 const> make2(T1&& v1, T2&& v2) {
  return foo<T1 const,T2 const>{std::tuple<T1 const, T2 const>(std::forward<T1>(v1),std::forward<T2>(v2))};
}

intそれは(つまり、非参照)タプルメンバーの作成に成功しました(タプル全体を簡単にconst作成できるので、それほどエキサイティングではありません)が、メンバーには何もしませんでした。なんで?その余分なものをどのように追加できますか?constdouble&const

4

1 に答える 1

1

T1 consttop-level を追加するため、機能しませんでしたconst。すなわち、それは とdouble &const違いはありませんdouble&。内部 const が必要です:「const T1 への参照」。

remove_referenceadd_const、 、またはを適切な場所にadd_reference配置する小さなトレイトを記述して、これを構築できます。const

template <typename T>
struct constify { using type = T; };
// needs a better name

template <typename T>
struct constify<T&> { using type = T const&; };

// and an alias for UX ;)
template <typename T>
using Constify = typename constify<T>::type;
于 2012-06-29T11:01:01.787 に答える