[英]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.