C++ 从模板参数获取可变参数

C++ 从模板参数获取可变参数,c++,templates,variadic,C++,Templates,Variadic,我有两个模板,一个作为参数传递给另一个。我希望能够在主模板中使用参数中的参数。或者如果我有: template <typename T, typename... Args> class Foo { typedef T Type; static void foo(Args... args) { } }; template <typename C> class Bar { void bar(Args... args) {

我有两个模板,一个作为参数传递给另一个。我希望能够在主模板中使用参数中的参数。或者如果我有:

template <typename T, typename... Args>
class Foo
{
    typedef T Type;
    static void foo(Args... args)
    {
    }
};

template <typename C>
class Bar
{
    void bar(Args... args)
    {
        // do something
        C::foo(args...);
    }
};
模板
福班
{
T型;
静态void foo(Args…Args)
{
}
};
模板
分类栏
{
空栏(Args…Args)
{
//做点什么
C::foo(args…);
}
};

如何使
Args
在模板
Bar
中可见。注意,使用
typedef T Type
,我可以在
Bar
中使用
C::Type
。如果可能,可变参数的语法是什么?

这里有一个基于模板参数的可能解决方案:

template<typename T>
class Bar;

template <template<typename...> class C, typename... Args>
class Bar<C<Args...>> {
    void bar(Args... args) {
        // do something
        C<Args...>::foo(args...);
    }
};
模板
分类栏;
模板
分类栏{
空栏(Args…Args){
//做点什么
C::foo(args…);
}
};
您可以按如下方式使用它:

Bar<Foo<int, double>> v;
Bar v;

您不能直接从
C
类获取参数
Args
。相反,我们的想法是利用
C
类本身是一个可变的模板化类这一事实,从而从
Bar

的模板专门化的参数列表中获得
Args
,您可以为包装
Args…
的“类型列表”使用typedef。下面是一个使用
tuple
执行类型列表角色的示例:

#include <tuple>
#include <experimental/tuple>

template <typename T, typename... Args>
class Foo
{
public:
    using Type = T;

    using Arguments = std::tuple<Args...>;

    static void foo(Args... args)
    {
    }
};

template <typename C>
class Bar
{
public:
    void bar(typename C::Arguments &&args)
    {
        // do something
        std::experimental::apply(C::foo, args);
    }
};

int main() {
    Bar<Foo<int, double, float>> b;
    b.bar(std::make_tuple(2.0, 1.0f));
}
#包括
#包括
模板
福班
{
公众:
使用类型=T;
使用参数=std::tuple;
静态void foo(Args…Args)
{
}
};
模板
分类栏
{
公众:
空栏(类型名C::参数(&args)
{
//做点什么
std::实验::应用(C::foo,args);
}
};
int main(){
b栏;
b、 bar(标准:make_tuple(2.0,1.0f));
}

通过更多的元编程,应该可以生成一个直接基于
C::arguments
获取参数的
Bar::Bar
函数。答案与不雅的把戏有关。因为我希望它不会回答这个问题,但从我试图做的事情来看,它是一个更好的选择——我会把它标记为solution@gsf实际上,通过这种方式,您可以使用主模板中参数的参数。因此,它也确实回答了这个问题。;-)