#include "MassivePOD.h"
#include "DependantClass.h" // Constructor: `DependantClass(MassivePOD&)`
class ExplicitSolution
{
public:
ExplicitSolution() : m_pod{...}, m_dep{m_pod} { };
private:
MassivePOD m_pod;
DependantClass m_dep;
};
template<typename... T>
class TemplatedSolution
{
public:
template<typename... TupArgs> TemplatedSolution(TupArgs...);
private:
// Can assume in-order construction works
std::tuple<T...> m_tuple;
};
int main()
{
ExplicitSolution a{}; // Easy!
TemplatedSolution<MassivePOD, DependantClass> b{
std::forward_as_tuple(...) // Forwarded to MassivePOD constructor
, std::forward_as_tuple(???) // Forwarded to DependantClass constructor
}; // Hard?
}
この例が私の問題を示していることを願っています。std::tuple
全体std::tuple
が構築される前に、以前に構築されたメンバーを参照したいと思います。これに対するエレガントな解決策はありますか?ハッカーを使えばそれが可能であることはわかっていvoid *
ますが、その暗い孤独な道を進む前に助けを求めたいと思います.
アイデア1
関数を作成しようとしましたget_ref
が、まだ作成されていないオブジェクトのメンバー関数にアクセスできないという同じ問題が発生します。とにかく、これは私の試みの1つです。
#include <tuple>
#include <utility>
class Foo // simplified base-case
{
public:
constexpr Foo(int x, char y, int& z) : m_tup{x, y, z*5.0} { };
constexpr int& get_int() { return std::get<0>(m_tup); };
constexpr char& get_char() { return std::get<1>(m_tup); };
constexpr double& get_double() { return std::get<2>(m_tup); };
private:
std::tuple<int, char, double> m_tup;
};
int main()
{
auto super = Foo(5, 'a', ::get_int()); // ???
}
アイデア2
次に、 の各要素がどこにあるかへのポインター/参照を含む静的オブジェクトを使用std::function
して、 で行うことのようなことができるのではないかと考えました。これは試してみる価値があると思いますが、実際に実装する方法がわかりません...std::place_holders
std::tuple