2016-10-04 54 views
0

首先是有可能繼承一個std ::元組的東西?C++ - 從一些東西添加虛擬功能的事情stur :: std :: tuple

我有一個

std::tuple<A, B> // (common base event data) 

std::tuple<C, D, E> someObj; 

所以,如果我構建了第二元組,第一個基類(或類似的東西)也應參與。

其次,我想更重要的是,在運行時我想根據我的類型選擇正確的虛函數。

因此,舉例來說,如果

std::tuple<A,B> { virtual void Serialize(); } 

我希望能夠特殊子類的專營方法,但使用模板,因此它可以在編譯時被擴展,但我可以在運行時選擇的方法。

我在考慮在代碼中構造問題,以便我可以實現這一點,但如果沒有,我將不得不爲每個元組使用手寫的樣板代碼。

+0

不,'的std :: tuple'不能從其他類,或一些其他的元組繼承。而你的第二個例子根本就沒有意義。元組沒有虛擬方法。 –

+3

你可能更喜歡只寫類來存儲你的數據。你爲什麼要使用'std :: tuple'? – TartanLlama

+0

你的例子不是C++代碼。你的代碼塊都不是有效的C++代碼。我明白了,你並不是說它是C++代碼,但是你的其他文章並不足以讓你知道你在說什麼。 「類似的東西」,「我想」,「基於我的類型」,「正確的」,「特殊的孩子」,「與結構不同」 - 許多無意義或模糊的手揮舞着。請儘可能包含儘可能多的真實代碼。解釋出了什麼問題。解釋你正在嘗試做的事情,儘可能與具體的代碼捆綁在一起。解釋你爲什麼這樣做。 – Yakk

回答

0

元組不會奇蹟般地擴展你想要的其他元組。您可以改爲提供自己的邏輯:

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; 
};