簡體   English   中英

將帶有可變參數模板參數作為其元素類型的 std::tuple 作為參數列表傳遞給另一個函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM