2017-06-19 107 views
1

我搜索了很多,可以找到許多類似的問題,但他們都沒有解決這個特定的問題AFAIK。匹配部分特化,以類型替換元組元素

我想通過類型(而不是索引)來替換元組中的類型。我試過這樣的:

template <class Tuple, class ToRemove, class ToReplace> 
struct ReplaceType { 
    using type = Tuple; 
}; 

template <class ToRemove, class ToReplace, class...Args, class...Args2> 
struct ReplaceType<std::tuple<Args..., ToRemove, Args2...>, ToRemove, ToReplace> { 
    using type = std::tuple<Args..., ToReplace, Args2...>; 

};

這不會工作,但我不明白爲什麼它不應該。它說,參數不抵扣的參數數量...和... Args2但對我來說應該是自然的,從調用現場猜:

typename ReplaceType<std::tuple<int, float, char>, float, double>>::type; 

從那裏INT應該Args1 ......在模板專業化和字符Args2 ...

  1. 爲什麼這不起作用?
  2. 有沒有解決方法?

回答

2

一步一個腳印。

首先,使用專業化將一種類型映射到另一種類型,而不改變所有其他類型。如果TToRemove,與`ToReplace替換它,否則不要管它:

template<typename T, typename ToRemove, typename ToReplace> 
struct replace_type { 

    using type=T; 
}; 

template<typename ToRemove, typename ToReplace> 
struct replace_type<ToRemove, ToRemove, ToReplace> { 

    using type=ToReplace; 
}; 

現在,一旦你已經得到了這一點的辦法,用專業化解包的元組類型,然後每次洗滌後重新包裝它們一個使用replace_type

template<class Tuple, typename ToRemove, typename ToReplace> 
struct replace_tuple; 

template<typename ...Args, typename ToRemove, typename ToReplace> 
struct replace_tuple<std::tuple<Args...>, ToRemove, ToReplace> { 

    using type=std::tuple<typename 
        replace_type<Args, ToRemove, ToReplace>::type 
        ...>; 
}; 

測試用gcc 6.3.1:

replace_tuple<std::tuple<int, char, int>, char, unsigned>::type foo; 

std::tuple<int, unsigned, int> *bar=&foo; 
+0

現在嘗試。爲什麼不能直接使用我所嘗試的?如果可能的話,我也想深入瞭解一下。無論如何,嘗試後,我很高興接受答覆,因爲它的工作原理。 –

+3

因爲參數包[無法推導,除非包是最後一個模板參數](https://stackoverflow.com/questions/14768951/variadic-function-template-with-pack-expansion-not-in-last-parameter ),所以你的'std :: tuple '在燃燒的殘骸中墜落,因爲它試圖推導出一個不是最後一個模板參數的參數包。 –

+1

Upvoting爲完成良好的工作實現和*在燃燒的殘骸*下降。不過,主要是因爲*燃燒的殘骸。 –

相關問題