【问题标题】:Recursive variadic template instation fails递归可变参数模板安装失败
【发布时间】:2017-03-05 05:35:14
【问题描述】:

原因是什么,在以下示例中,具有三个 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>();
}

感谢您的任何提示!

【问题讨论】:

  • “它不工作”不是问题描述。
  • 1 不是类型,反之亦然。
  • 一个模板需要一个类型,你给它一个整数文字。另一个模板需要一个整数,你给它一个类型。你对这不起作用感到惊讶吗?

标签: c++ templates variadic


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2020-06-05
    • 2017-03-18
    • 1970-01-01
    相关资源
    最近更新 更多