1

Я пытаюсь создать функцию, которая имеет специализированную специализацию шаблона (у нее нет параметров), и она печатает сообщение до тех пор, пока последняя специализация не сделает печать другим. стоп. Как я действительно плохо объяснить, здесь я выкладываю код, что я пытаюсь сделать:Предоставление пакета шаблонов Variadic в качестве функции спецификации

template <typename T> 
constexpr void UpdateStuff() 
{ 
    std::cerr << "I am the last one :D" << std::endl; 

} 
template< typename T ,typename... TT> 
constexpr void UpdateStuff() 
{ 



    std::cerr << "I am NOT the last one :D"; 

    UpdateStuff<TT...>(); 

} 
int main() 
{ 


    UpdateStuff<int,double>(); // Should only print text twice 
    std::cin.get(); 

    return 1; 
} 

В первой ноты, я знаю, это не работает, UpdateStuff<TT...>(); это дает Неоднозначный вызов к перегруженной функции, мне удалось заставить ее работать, задав параметры UpdateStuff(), такие как UpdateStuff(T first, TT... second), и специализация только одна UpdateStuff(T first), но я хочу знать, возможно ли это без параметров функции, я дам резюме моих вопросов:

  • I Dont полностью понять, почему UpdateStuff<TT...>(); не работает, если TT является только double во время компиляции, почему он не использует первую функцию?
  • Возможно ли выполнить то, что я пытаюсь выполнить без параметров функции?

Заранее благодарим за это, и если вы не понимаете что-то, связанное с моим вопросом, я был бы благодарен, чтобы объяснить это лучше, и извините за мой бедный английский.

+0

Я предполагаю, что 'UpdateStuff ()' будет соответствовать обоим перегрузкам 'функций UpdateStuff' как' TT' будет выведен там как пустой пакет ... –

ответ

0

Да, это возможно.

Но учтите, что typename ... TT - «ноль или более типов имен», поэтому звоните UpdateStaff<double>() обе версии UpdateStaff() в порядке.

Вы можете, например, наложить второй тип в не окончательной версии; что-то вроде этого

template <typename T1, typename T2, typename... TT> 
constexpr void UpdateStuff() 
{ 
    std::cerr << "I am NOT the last one :D"; 

    UpdateStuff<T2, TT...>(); 
} 
+0

Спасибо вам много ! И эти ответы были довольно быстрыми: D – Bollafa