元組不會奇蹟般地擴展你想要的其他元組。您可以改爲提供自己的邏輯:
template<typename... Types>
using child_tuple = std::tuple<A, B, Types...>
template<typename... Args>
auto make_child_tuple(A a, B b, Args&&... args) {
return child_tuple<std::decay_t<Args>...>{a, b, std::forward<Args>(args)...};
}
,如果你想虛函數的元組(唉,沒有),你將不得不推出自己的結構:
struct Interface {
virtual void serialize() = 0;
};
template<typename... Types>
struct poly_child_tuple: Interface, child_tuple<Types...> {
void serialize() override { /* ... */ }
};
不過,我強烈建議您爲模板函數的形式,你的元組提供一個通用的序列化功能(請這麼做):
template<typename... Types, std::size_t... S>
void serialize(std::index_sequence<S...>, const std::tuple<Types...>& tuple) {
int unpack[] = {(static_cast<void>(
[](auto&& value){
// Do things for each `value` in `tuple`
}(std::get<S>(tuple))
), 0)..., 0};
}
template<typename... Types>
void serialize(const std::tuple<Types...>& tuple) {
serialize(std::index_sequence_for<Types...>{}, tuple);
}
然後,與實現,你可以調用直接調用它的已知類型的元組,或者您可以從虛擬方法調用它,這是您在問題中描述的內容。
下面是使用的例子:
template<typename... Types>
struct serializable_tuple_impl : Interface {
void serialize() override {
::serialize(tuple);
}
private:
child_tuple<Types...> tuple;
};
不,'的std :: tuple'不能從其他類,或一些其他的元組繼承。而你的第二個例子根本就沒有意義。元組沒有虛擬方法。 –
你可能更喜歡只寫類來存儲你的數據。你爲什麼要使用'std :: tuple'? – TartanLlama
你的例子不是C++代碼。你的代碼塊都不是有效的C++代碼。我明白了,你並不是說它是C++代碼,但是你的其他文章並不足以讓你知道你在說什麼。 「類似的東西」,「我想」,「基於我的類型」,「正確的」,「特殊的孩子」,「與結構不同」 - 許多無意義或模糊的手揮舞着。請儘可能包含儘可能多的真實代碼。解釋出了什麼問題。解釋你正在嘗試做的事情,儘可能與具體的代碼捆綁在一起。解釋你爲什麼這樣做。 – Yakk