【发布时间】:2021-02-10 20:59:48
【问题描述】:
您能否使用可变参数模板编写一个函数,该模板接受任意元组列表,每个元组都有一组不同的参数?所以你会有类似的东西:
template< /* some crazy variadic thing...*/ >
void func( ... ) {}
func(make_tuple(1,2), make_tuple("hello"));
SFINAE 来救援!
进一步了解杰弗里的回答,我写了这个小sn-p。您可以将元组以外的类型放在 func 的参数列表中的任何位置,它将编译并运行,当它遇到不是模板类的第一个类型时,它只会中断我的打印链。 seq 和 gens 来自 here。
template<typename T>
int print(T& t) {
cout << t << " ";
return 0;
}
template<typename... T> void dumby(T...) {}
// so other template classes don't cause error (see bar below)
template<typename... A>
void expand(A... a) {}
template<typename... A, int... S>
void expand(tuple<A...> a, seq<S...>) {
dumby(print(get<S>(a))...);
cout << endl;
}
template<class... Types>
void func(Types...) {}
template<template<typename...> class A, class... Types, class... tup_types>
void func(A<tup_types...> a, Types... args) {
expand(a, typename gens<sizeof...(tup_types)>::type());
func(args...);
}
template<typename... A> struct bar {};
int main () {
func(make_tuple(0,1), make_tuple(2), 1, make_tuple("hello"), 0);
func(make_tuple(0,1), bar<int,int>(), make_tuple(2), 1, make_tuple("hello"), 0);
}
我必须找到一个实际的用例来进行尝试,但我认为这是暂时的成功!
【问题讨论】:
-
用例是什么?你会怎么写正文?
-
嗯,它是 C++;所以显而易见的答案是肯定的:P 但我相信有人会愿意详细说明。
-
@CoffeeandCode,实际上是不可能的。
-
@Jefffrey 在我的代码中,我有一个工厂,我可以在其中调用具有任意参数的构造函数,然后调用具有任意参数的初始化器成员。我可以这样做,因为函数的数量是有限的。但这让我对一般情况感到好奇。
标签: c++ templates variadic-templates