从模板参数中获取可变参数

时间:2016-04-25 20:40:37

标签: c++ templates variadic

我有两个模板,一个作为参数传递给另一个。我希望能够在主模板中使用参数中的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...);
    }
};

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

2 个答案:

答案 0 :(得分:4)

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

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...);
    }
};

您可以按照以下方式使用它:

Bar<Foo<int, double>> v;

您没有直接从Args类获取参数C。相反,我们的想法是利用C类本身就是一个可变模板的事实,从而从Args的模板特化的参数列表中获取Bar

答案 1 :(得分:1)

您可以为&#39;类型列表提供typedef&#39;包裹Args...。以下是使用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));
}

通过更多的元编程,应该可以生成一个Bar::bar函数,该函数直接根据C::Arguments获取参数。