![](/img/trans.png)
[英]specialization of variadic template function for std::tuple as return type
[英]Pass std::tuple with variadic template parameter as its elements type to another function as a list of parameters
我一直在實現我的std::map
版本,以從內部更深入地了解事物的工作原理。 在實施std::map::emplace()
,我遇到了一個問題。
所以,我的函數簽名是這樣的:
template <typename Key, typename Value>
template <typename ... Args1, typename ... Args2>
std::pair<typename Map<Key, Value>::Iterator, bool> Map<Key, Value>::emplace(
std::piecewise_construct_t pwc,
std::tuple<Args1...> first_args,
std::tuple<Args2...> second_args);
在實際放置之前,我確實需要從first_args
構造鍵,以便比較樹中的鍵。 我已經嘗試了一些事情,但無法找出正確的方法來做到這一點。 據我了解,它應該是這樣的:
Key k(std::get<sizeof...(Args1)>(std::forward<Args1>(first_args));
問題是,對於元組的每個元素, std::get()
應該接收不同的數字作為其模板參數(以便元組的正確元素將被傳遞到正確的位置)。
我已經看到人們通過將 size 作為模板參數並將std::index_sequence
作為參數之一來解決這個問題,但是std::map::emplace()
沒有任何這種方法,所以應該有一種方法沒有這個就實施安置。
先感謝您。 任何建議將被認真考慮!
我已經看到人們通過將 size 作為模板參數並將 std::index_sequence 作為參數之一來解決這個問題,但是 std::map::emplace() 沒有任何這種方法,所以應該有一種方法沒有這個就實施安置。
std::map::emplace()
確實沒有收到std::index_sequence
,但我不知道是否在內部創建std::index_sequence
並調用輔助函數來正確管理元組。
換句話說,你可以這樣寫
Key k { make_object_from_tuple<Key>(first_arg, std::index_sequence_for<Args1...>{}) };
在make_object_from_tuple()
您可以使用std::index_sequence
從元組中提取元素並構造Key
對象。
換句話說:根據 Kerndog73 的建議,您可以復制此頁面中的std::make_from_tuple_impl()
實現。
如果您不想開發新函數,可以使用std::pair
的分段構造函數。
沒有什么能強迫你構造一個std::pair<Key, Value>
:如果你想先構造一個Key
並且只有在必要時,然后構造Value
,你可以在std::pair<Key, int>
和之后構造 (在這種情況下)一個std::pair<Value, int>
。
我的意思是......你可以在沒有Value
情況下創建Key
std::tuple<int> ti{0};
Key k { std::pair<Key, int>{std::piecewise_construct_t, first_args, ti).first };
之后,僅在您需要時, Value
Value v { std::pair<Value, int>{std::piecewise_construct_t, second_args, ti).first };
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.