我在C++17中有一个模板函数,其中第N个参数需要是整型,这应该在模板替换过程中检查。(模板函数不应该为不满足条件的参数而存在,所以函数体中的static_assert()
不起作用。)
它是类的构造函数,所以SFINAE是在模板参数中完成的。
对于固定的N = 2,这起作用:
struct A {
template<class Arg1, class Arg2, class... OtherArgs,
std::enable_if_t<(std::is_integral_v<Arg1> && std::is_integral_v<Arg2>), int> = 0
>
A(Arg1 arg1, Arg2 arg2, OtherArgs... otherArgs)
};
字符串
然而,当N
是一个模板参数时,似乎没有明显的方法。
要检查 * 所有 * 参数是否都是积分,可以这样做:
template<std::size_t N>
struct A {
template<class... Args,
std::enable_if_t<std::conjunction_v<std::is_integral<Args>...>, int> = 0
>
A(Args... args)
};
型
这里有没有像INDEX_OF
这样的工具,它可以获取参数包中参数的索引,这样is_integral
只需要对前N个参数为真?
template<std::size_t N>
struct A {
template<class... Args,
std::enable_if_t<std::conjunction_v<
std::disjunction<
std::bool_constant< (INDEX_OF(Args) >= N) >,
std::is_integral<Args>
>...
>, int> = 0
>
A(Args... args)
};
型
2条答案
按热度按时间5lhxktic1#
你可以创建constexpr函数:
字符串
然后
型
Demo
或者,
std::index_sequence
是一种拥有索引和类型的方法(来自元组)型
Demo的
7eumitmz2#
您可以创建一个辅助模板:
字符串
这有点像
std::conjunction
,但不会短路模板示例化。替代方案
如果示例化是贪婪的,那么我们也可以使用一组
bool
:型
保持
std::conjunction
短循环示例化为了提高编译速度,也只是出于必要,
std::conjunction
短路并且不示例化所有给定类型的事实是有用的。这可以使用经典的递归模板来实现:型