簡體   English   中英

遞歸可變參數模板插入失敗

[英]Recursive variadic template instation fails

這是什么原因,在下面的示例中,具有三個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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM