假設我有一個可以遞增的模板參數列表。我想增加這個列表的頭部。下面是代碼變量模板重載分辨率
template<int N>
struct Counter {
static constexpr Counter<N+1> increment();
};
template<int N>
constexpr Counter<N+1> Counter<N>::increment() {
return Counter<N+1>();
}
//List (will be used as List of Counters)
template <typename... TAIL>
struct List {};
template <typename HEAD, typename... TAIL>
struct List<HEAD,TAIL...> {};
template <typename HEAD, typename... TAIL>
auto incrFront() -> decltype(List<decltype(HEAD::increment()),TAIL...>()) {
return List<decltype(HEAD::increment()),TAIL...>();
}
它確實工作:
auto l0 = incrFront<Counter<0>>(); // Ok, decltype(l0) == List<Counter<1>>
l0 = List<Counter<1>>(); //Ok, right type
auto l1 = incrFront<Counter<0>,Counter<1>>(); // Ok, decltype(l1) == List<Counter<1>,Counter<1>>
l1 = List<Counter<1>,Counter<1>>();
現在,我想遞增名單的後面,所以
template <typename... HEAD, typename TAIL>
auto incrBack() -> decltype(List<decltype(HEAD...,TAIL::increment())>()) {
return List<decltype(HEAD...,TAIL::increment()>();
}
但有錯誤 'incrBack'未在此範圍內聲明
我試圖在此之前添加另一種方法:
template <typename... HEAD>
auto incrBack() -> decltype(List<HEAD...>()) {
std::cout << "Should not be here\n";
return List<HEAD...>();
}
希望這個方法在解析重載時永遠不會被調用,但是這個方法的確被調用。
任何線索?我只是想這個例子是工作:
auto l2 = incrBack<Counter<1>,Counter<1>>(); // I want decltype(l2) == List<Counter<1>,Counter<2>>
l2 = incrFront<Counter<0>,Counter<2>>(); //should be possible
一個可變參數包燕子*任何及所有參數*'TAIL'將永遠不會有一個類型, 'incrBack'從重載解析中移除。 – Xeo
你需要遞歸來消化所有的參數,直到你到達最後並遞增它。 – jrok
這真的是你想要'incrFront'工作嗎?因爲沒有任何推導,並且列表沒有被封裝,所以每次都必須使用明確的參數包來調用它。有點失敗的目的,不是? – Potatoswatter