如何在 C++ 中专门化可变参数模板函数?
How to specialize a variadic template function in c++?
让函数 foo 具有以下“签名”:
template<typename ...Ts>
void foo(Ts ...args)
这有点过头了,因为我只需要 foo 来处理 double
s。我如何修改 foo 使其仅接受 double
s?
The original code has been 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);
}
输出为:
-2.44 -5.66 78.99
您可以像这样限制您的模板:
template<typename ...Ts>
requires std::conjunction_v<std::is_same<double, Ts>...>
void foo(Ts ...args)
{
// ...
}
这是一个demo
正如HolyBlackCat所指出的,您可以像这样编写模板更方便:
void foo(std::same_as<double> auto ...args)
{
(std::cout << ... << args);
}
另请注意,您可以使用折叠表达式来打印参数。
这里是 demo。
我们这些仍然坚持使用 C++17 的人将不得不使用稍微丑陋的语法:(
template<typename ...Ts>
std::enable_if_t<std::conjunction_v<std::is_same<Ts, double>...>> foo(Ts ...args)
{
(std::cout << ... << args);
}
让函数 foo 具有以下“签名”:
template<typename ...Ts>
void foo(Ts ...args)
这有点过头了,因为我只需要 foo 来处理 double
s。我如何修改 foo 使其仅接受 double
s?
The original code has been 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);
}
输出为:
-2.44 -5.66 78.99
您可以像这样限制您的模板:
template<typename ...Ts>
requires std::conjunction_v<std::is_same<double, Ts>...>
void foo(Ts ...args)
{
// ...
}
这是一个demo
正如HolyBlackCat所指出的,您可以像这样编写模板更方便:
void foo(std::same_as<double> auto ...args)
{
(std::cout << ... << args);
}
另请注意,您可以使用折叠表达式来打印参数。
这里是 demo。
我们这些仍然坚持使用 C++17 的人将不得不使用稍微丑陋的语法:(
template<typename ...Ts>
std::enable_if_t<std::conjunction_v<std::is_same<Ts, double>...>> foo(Ts ...args)
{
(std::cout << ... << args);
}