C++ 使用 next 函数 returns nothing 解压可变参数模板参数

C++ unpack variadic template arguments with the next function returns nothing

我正在尝试将参数扩展为可变参数函数。下面的代码工作得很好

template<typename T>
int printMy (const T& f)
{
    cout << f << endl;
}
template<typename... Types>
void print (Types... args)
{
    auto i = {printMy(args)...};
}

int main() {
    std::string s("world");
    print(7.5, "hello", s);
    return 0;
}

但是,我真的不想 return 函数中的任何内容。我实际上希望它是无效的。但是,当我有如下代码时,它不起作用

template<typename T>
void printMy (const T& f)
{
    cout << f << endl;
}
template<typename... Types>
void print (Types... args)
{
    {printMy(args)...};
    // same thing if I remove the brackets
    // printMy(args)...;
}

它在“{printMy(args)...};”行给我一个错误。错误是“表达式包含未扩展的参数包 'args'”

您可以在 C++17 中使用 fold expression 来计算对参数包的所有参数使用二元运算符的结果,以解决如下所示的问题。显示的程序使用 一元右折叠 来达到预期的效果。

template<typename... Types>
void print (Types... args)
{
  
    (printMy(args), ...);//uses fold expression in C++17
}

Demo

从 C++17 开始,您可以使用

template<typename... Types>
void print (Types... args)
{
    (printMy(args), ...);
}

在此之前,你必须使用类似于你所做的技巧:

template<typename... Types>
void print (Types... args)
{
    const int dummy[] = {0, (printMy(args), 0)...};
    static_cast<void>(dummy); // Avoid warning for unused variable
}