假设我有一个可以递增的模板参数列表。我想增加这个列表的头部。这是代码
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