如何在 C++ 中专门化一个可变参数模板函数?

Blu*_*une 3 c++ variadic-functions specialization c++20

让函数 foo 带有以下“签名”:

template<typename ...Ts>
void foo(Ts ...args)
Run Code Online (Sandbox Code Playgroud)

这有点过头了,因为我只需要 foo 来处理doubles。如何修改 foo 使其double仅接受s ?

原始代码已被Godbolted:

#include <tuple>
#include <iostream>

template<typename ...Ts>
void foo(Ts ...args)
{
    std::tuple<Ts...> tu(args...);
    std::apply([](Ts const&... tupleArgs)
        {
            ((std::cout << tupleArgs << " "), ...);
        }, tu);
}

int main()
{
    foo(-2.44, -5.66, 78.99);
}
Run Code Online (Sandbox Code Playgroud)

输出如下:

-2.44 -5.66 78.99

cig*_*ien 6

你可以像这样约束你的模板:

template<typename ...Ts>
requires std::conjunction_v<std::is_same<double, Ts>...>
void foo(Ts ...args)
{
  // ...
}
Run Code Online (Sandbox Code Playgroud)

这是一个演示

正如 HolyBlackCat 所指出的,您可以像这样更方便地编写模板:

void foo(std::same_as<double> auto ...args)
{
    (std::cout << ... << args);
}
Run Code Online (Sandbox Code Playgroud)

另请注意,您可以使用折叠表达式来打印参数。

这是一个演示