如何在c++中专门化可变模板函数



让函数foo给定以下"签名":

template<typename ...Ts>
void foo(Ts ...args)

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

原始代码已被破解:

#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);
}

输出显示:

-2.44-5.66 78.99

您可以这样约束模板:

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

这是的演示

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

void foo(std::same_as<double> auto ...args)
{
(std::cout << ... << args);
}

还要注意,您可以使用fold表达式来打印参数。

这是一个演示。

我们这些仍然使用C++17的人将不得不使用一个稍微丑陋的语法:(

template<typename ...Ts>
std::enable_if_t<std::conjunction_v<std::is_same<Ts, double>...>> foo(Ts ...args)
{
(std::cout << ... << args);
}

最新更新