让函数foo给定以下"签名":
template<typename ...Ts>
void foo(Ts ...args)
这有点过头了,因为我只需要foo来处理double
s。如何修改foo,使其仅接受double
s?
原始代码已被破解:
#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);
}