递归可变参数模板实例失败

时间:2016-10-23 09:38:28

标签: c++ templates variadic

原因是什么,在以下示例中,具有三个int的instantiaton正在使用第二个函数模板,但不使用第一个函数模板。 附加:对于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>();
}

谢谢你的任何提示!

1 个答案:

答案 0 :(得分:0)

第一种情况下的问题是,当您传递单个模板参数(参数包可以为空)时,两个模板特化都匹配,因此重载集包含多个候选项。您可以使用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;
}