假设我有一个可变参数模板类。如何创建一个函数,使其参数属于集合类型,例如int
,参数个数等于模板类型的数量?
template <typename... Types>
class Test
{
public:
void Func(???); // I don't know how to declare such a function
}
Test<string, bool, long> myTest; // Three types
myTest.Func(905, 36, 123315); // Three arguments, but always of type int.
最后,该函数的目标是返回所提供的int的元组。为简单起见,我在示例代码中将函数显示为无效。
答案 0 :(得分:18)
template <typename... Types>
class Test
{
template <typename>
using int_t = int;
public:
void Func(int_t<Types>... ints)
{
}
};
答案 1 :(得分:4)
wandbox example - (适用于C ++ 11)
如果您不需要SFINAE,可以使用static_assert
确保符合条件:
template <typename... Types>
class Test
{
public:
template <typename... Ts>
void Func(Ts...)
{
static_assert(sizeof...(Ts) == sizeof...(Types), "");
static_assert(std::conjunction<std::is_same<Ts, int>...>{}, "");
}
};
(如果您需要SFINAE,请使用std::enable_if
。)
std::conjunction
检查传递给它的所有条件是否为真。
通过上面的示例,以下调用有效/无效:
myTest.Func(905, 36, 123315); // valid
myTest.Func(905, 36, 123315.f); // invalid
myTest.Func(905, 22); // invalid
如您所见,此解决方案不允许使用隐式转换。如果您希望允许,可以使用std::is_convertible
代替std::is_same
。