原因是什么,在以下示例中,具有三个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>();
}
谢谢你的任何提示!
答案 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;
}