类型限制的可变参数模板函数
Type-restricted variadic template functions
我可以编写以下代码来定义一个接受任意数量参数的函数:
template <typename... Arguments>
void f(Arguments... sums) {
// Do something.
}
然后像这样称呼它
f(1, 2, 3, 4);
但是我如何将所有参数限制为例如整数?
您可以为函数使用 std::initializer_list<int>
参数。但不幸的是,在这种情况下需要在参数周围指定额外的花括号。
f({1, 2, 3, 4});
从 雇用 all_true
你可以使用以下内容:
#include <type_traits>
template <bool...> struct bool_pack;
template <bool... v>
using all_true = std::is_same<bool_pack<true, v...>, bool_pack<v..., true>>;
template<typename... Args,
typename = std::enable_if_t<all_true<std::is_same<int, Args>{}...>{}>>
void f(Args... sums)
{
// Do something.
}
int main()
{
f(1, 2, 3, 4);
f(1.1, 2, 3, 4); // compile error
}
我可以编写以下代码来定义一个接受任意数量参数的函数:
template <typename... Arguments>
void f(Arguments... sums) {
// Do something.
}
然后像这样称呼它
f(1, 2, 3, 4);
但是我如何将所有参数限制为例如整数?
您可以为函数使用 std::initializer_list<int>
参数。但不幸的是,在这种情况下需要在参数周围指定额外的花括号。
f({1, 2, 3, 4});
从 all_true
你可以使用以下内容:
#include <type_traits>
template <bool...> struct bool_pack;
template <bool... v>
using all_true = std::is_same<bool_pack<true, v...>, bool_pack<v..., true>>;
template<typename... Args,
typename = std::enable_if_t<all_true<std::is_same<int, Args>{}...>{}>>
void f(Args... sums)
{
// Do something.
}
int main()
{
f(1, 2, 3, 4);
f(1.1, 2, 3, 4); // compile error
}