簡體   English   中英

根據作為參數接收的函數,定義具有模板化鍵類型的std :: map

[英]Define a std::map with a templated Key type based on a function that is received as a parameter

我的目標是擁有一個返回映射的函數,該映射的Key類型會根據作為參數傳遞給我的函數的函數而改變。

到目前為止,我具有以下模板化函數(C ++ 11)作為唯一可編譯的解決方案:

    template <typename Container, typename Function, typename KeyType>
    std::map< KeyType, std::vector<typename Container::value_type> > 
    group_by(Container &container, Function function, KeyType keyHint) { ...

現在,這允許我以這種方式使用該函數:

// the last parameter is just a type hint for the compiler
std::map<int, std::vector<int>> m = group_by(vec, func_that_returns_an_int, 1337);
...
std::map<int, std::vector<int>> m = group_by(vec, func_that_returns_an_int, -1);

// if we pass a function that returns bool, the map's key will be boolean
// the last parameter passed is just a hint for the compiler
std::map<bool, std::vector<int>> m = group_by(vec, is_even, true);
...
std::map<bool, std::vector<int>> m = group_by(vec, is_even, false);

我的目標是不必傳遞隨機值來提示編譯器Map的Key類型應該是什么,我希望我可以這樣做:

std::map<int, std::vector<int>> m = group_by<int>(vec, func_that_returns_an_int);
...
std::map<bool, std::vector<int>> m = group_by<bool>(vec, is_even);

還是有可能嗎?

std::map<bool, std::vector<int>> m = group_by(vec, is_even);

我正在使用auto和decltype進行操作,以查看編譯器是否可以由操作的左側提示而沒有運氣。

auto group_by(Container &container, Function function) -> std::map< decltype(function(Container::value_type)), >

更改順序或模板參數將允許您調用它

group_by<int>(vec, func_that_returns_an_int);

所以改變

template <typename Container, typename Function, typename KeyType>
std::map< KeyType, std::vector<typename Container::value_type> > 
group_by(Container &container, Function function, KeyType keyHint)

template <typename KeyType, typename Container, typename Function>
std::map< KeyType, std::vector<typename Container::value_type> > 
group_by(Container &container, Function function)

要完全刪除KeyType ,必須從其他參數推導出它:

template <typename Container, typename Function>
auto group_by(Container &container, Function function)
-> std::map<decltype(function(*container.begin())),
            std::vector<typename Container::value_type> > 

您可以使用std::result_of<>

#include <map>
#include <vector>
#include <type_traits>

template <typename Container, typename Function, typename KeyType = std::result_of_t<Function()>>
auto group_by(Container c, Function f) -> std::map< KeyType, std::vector<typename Container::value_type>>
{
    return // ...
}

int bar() { return 42; }

int main()
{
    auto v = group_by(std::vector<double>{}, bar);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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