簡體   English   中英

我怎樣才能讓這個 function 模板在不管我傳遞字符串文字還是字符串 object 的情況下工作?

[英]how can I get this function template to work reguardless of whether I pass a string literal or a string object?

我有以下 function 模板,它采用任何類型的 map 並返回與某個鍵關聯的值或調用站點提供的默認值:

template <template <typename Key, typename Val, typename ...Args> typename C, typename Key, typename Val, typename ...Args>
Val get_or_default(C<Key, Val, Args...> const& my_map, Key const& k, Val const& v)
{
    typename C<Key, Val, Args...>::const_iterator const it = my_map.find(k);
    return (it != my_map.end()) ? it->second : v;
}

當我這樣調用 function 時:

// initialize map
    std::map<std::string, int> m1{ {"jim",1},{"mark",2},{"sally",3} };
// call get_or_default with std::string as key arg
    std::cout << get_or_default(m1, std::string("jim"), -1) << std::endl;

一切都按預期工作,但是當我像這樣調用 function 時:

std::cout << get_or_default(m1, "jim", -1) << std::endl;

我收到以下錯誤消息:

error C2782: 'Val get_or_default(const C<Key,Val,Args...> &,const Key &,const Val &)': template parameter 'Key' is ambiguous

我認為參數Key不明確,因為它是在 map 模板中使用std::string調用的,但對於get_or_default的第二個參數是const char*

無論我傳遞的是字符串 object 還是字符串文字,如何讓這個 function 工作?

非常感謝您的幫助。

由於您對Key模板參數的推導有沖突,您可以簡單地將Key arguments 之一設為非推導上下文。

首先提供一個簡單的類型標識結構:

template<typename T>
struct I { using type = T; };

然后像這樣使用它:

template <template <typename Key, typename Val, typename ...Args> typename C,typename Key, typename Val, typename ...Args>
Val get_or_default(C<Key, Val, Args...> const& my_map, typename I<Key>::type  const &k, Val const& v)
{
    typename C<Key, Val, Args...>::const_iterator const it = my_map.find(k);
    return (it != my_map.end()) ? it->second : v;
}

你可以稍微簡化一下。 刪除模板模板參數名稱,因為它們無論如何都不會被使用。 此外,您可以將auto用於迭代器類型。 此外,可變參數 arguments 似乎沒有用於任何目的。

template <template <typename, typename> typename C, typename Key, typename Val>
Val get_or_default(C<Key, Val> const& my_map, typename I<Key>::type const &k, Val const& v)
{
    auto const it = my_map.find(k);
    return (it != my_map.end()) ? it->second : v;
}

這是一個工作演示

這應該適合你:

template<class C, class Key, class Val>
Val get_or_default(C const& mp, Key const& k, Val const& v)
{
    typename C::const_iterator it = mp.find(k);
    return (it != mp.end()) ? it->second : v;
}

如果您想要更好的類型限制和錯誤消息並且 c++ 20 是一個選項,那么概念就是 go

暫無
暫無

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

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