#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
。有一个优雅的解决方案吗?我知道使用hackery是可能void *
的,但我宁愿在走上那条黑暗孤独的道路之前寻求一些帮助。
理念一
我尝试过创建一个get_ref
函数,但我遇到了同样的问题,即我无法访问尚未创建的对象的成员函数。不过,这是我的尝试之一。
#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
with的事情std::place_holders
,所以一个静态对象包含一个指向每个元素所在位置的指针/引用std::tuple
。我认为这值得一试,但我不知道如何在实践中实现它......