递归可变模板安装失败

Recursive variadic template instation fails

本文关键字:安装 失败 递归      更新时间:2023-10-16

在下面的例子中,具有三个int的实例化与第二个函数模板一起工作,而不是与第一个函数模板一起工作,这是什么原因呢?附加:对于State1/State1类型,它也不能工作。

struct State1{};
struct State2{};
#if 0
template<typename none = void>
constexpr void f()
{
}
template<typename First, typename... Rest>
constexpr void f()
{
    f<Rest...>();
}
#else
template<typename none = void>
constexpr void f()
{
}
template<int First, int... Rest>
constexpr void f()
{
    f<Rest...>();
}
#endif
void test()
{
   f<1, 2, 3>();
//    f<State1, State2>();
}

谢谢你的提示!

第一种情况的问题是,当您传递单个模板参数(参数包可以为空)时,两个模板专门化都匹配,因此重载集包含多个候选模板。您可以使用SFINAE来使第二个实例化失败:

#include <type_traits>
struct State1{};
struct State2{};
template<typename none = void>
constexpr auto f() -> void
{
}
template<typename First, typename... Rest>
constexpr auto f() -> std::enable_if<sizeof...(Rest), void>::type
    // This will not instantiate when the parameter pack is empty
    // And the overload set will contain only the candidate above
{
    f<Rest...>();
}
int main()
{
  f<State1, State2>();
  return 0;
}