【问题标题】:Get the variadic arguments from template argument从模板参数中获取可变参数
【发布时间】:2016-04-26 06:00:59
【问题描述】:

我有两个模板,一个作为参数传递给另一个。我希望能够使用主模板中参数中的 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,我可以在Bar 中使用C::Type。如果可能的话,可变参数的语法是什么?

【问题讨论】:

标签: c++ templates variadic


【解决方案1】:

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

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;

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

【讨论】:

  • 这不能回答问题,但这是我尝试做的更好的选择 - 我会将其标记为解决方案
  • @gsf 好吧,实际上通过这种方式您可以使用主模板中参数中的 Args。所以,它也确实回答了这个问题。 ;-)
【解决方案2】:

你可以有一个用于包装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));
}

通过更多元编程,应该可以生成一个Bar::bar 函数,该函数直接基于C::Arguments 接受参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-29
    • 2011-04-08
    • 1970-01-01
    • 2016-12-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多