考虑
class B; class C;
class A {
using linked_from = std::tuple<B,C>; // i.e. A is "linked from" B and C.
};
class B {
using linked_to = std::tuple<A,C>; // i.e. B is "linked to" A and C.
};
class C {
using linked_to = std::tuple<A>;
using linked_from = std::tuple<B>;
};
我想要做的是重新设计上述内容,以便在更改linked_to
成员类型时不需要维护。
template <typename To, typename From>
struct LinkFromMap {
using linked_from = From;
};
template <typename From, typename To>
struct LinkPair : LinkFromMap<To, From> {};
template <typename T, typename... Ts>
struct Link : LinkPair<Ts, T>... {
using linked_to = std::tuple<Ts...>;
};
class B; class C;
class A {};
class B : public Link<B, A,C> {};
class C : public Link<C, A> {};
int main() {
static_assert(std::is_same<B::linked_to, std::tuple<A,C>>::value, "");
// Still need to obtain std::tuple<B,C> from A, std::tuple<B> from C, etc...
}
A
和C
不需要保留linked_from
成员类型,只要std::tuple<B,C>
A
和std::tuple<B>
可以获得LinkFromMap
可以从C获得。这就是我在上面定义LinkFromMap
的原因,但我无法弄清楚如何使用<A, B,C>
来实现这一点。是否可以在某种程度上使用它来形成包<C,B>
和linked_from
或类似的东西?或者有更好的方法可以自动执行SQL_Latin1_General_CP1_CI_AS
设计的类型检索吗?