如何从C++ 11中的可变模板类型(例如std::tuple)中提取参数包?

huangapple go评论111阅读模式
英文:

How could extract parameter pack from variadic template type (e.g. std::tuple) in C++ 11

问题

使用C++11,如何将模板类型的可变参数提取为参数包?

假设我们有模板特化类型Argument_t

...

template<typename F>
using Argument_t = typename ArgumentType<F>::type; // Args...的std::tuple

现在我想在另一个结构体中使用这个模板特化,以将模板参数的签名复制到一个方法中。例如:

template<typename F>
struct SomeStruct {

    // 我应该如何在这里使用Args...,Args...应该是Argument_t<F>的一部分。
    void some_method(Args... args) 
    { 
        ...
        // 应该能够访问some_member_data
    };

    ...

    static int some_member_data;

}

像这样,如何使用Args...,其中Args...std::tuple<Args...>?或者是否有更好的方法,而不是提供std::tuple<Args...>而是提供Argument_t

英文:

With C++ 11 How can I extract a variadic argument of a template type as a parameter pack?

Say we have template specialization type Argument_t

...

template&lt;typename F&gt;
using Argument_t = ArgumentType&lt;F&gt;::type; // std::tuple of Args...

Now I would like to use this template specialization in another struct to copy the signature of the template argument to a method. e.g.

template&lt;typename F&gt;
struct SomeStruct {

    // How can I do this where Args... is that of Argument_t&lt;F&gt;.
    void some_method(Args... args) 
    { 
        ...
        // Should have access to some_member_data
    };

    ...

    static int some_member_data;

}

Like this how could one use Args... where having std::tuple&lt;Args...&gt;. Or is there any better way instead of Argument_t providing std::tuple&lt;Args...&gt;.

答案1

得分: 1

我认为在你的情况下,更简单的方法是通过专门化:

template <typename Tuple> struct SomeStruct;

template <typename... Args>
struct SomeStruct<std::tuple<Args...>>
{
    void some_method(Args... args) 
    { 
        // ...
    }
    // ...
};
英文:

I think simpler way is with specialization in your case:

template &lt;typename Tuple&gt; struct SomeStruct;

template &lt;typename... Args&gt;
struct SomeStruct&lt;std::tuple&lt;Args...&gt;&gt;
{
    void some_method(Args... args) 
    { 
        // ...
    }
    // ...
};

huangapple
  • 本文由 发表于 2023年7月20日 12:01:30
  • 转载请务必保留本文链接:https://go.coder-hub.com/76726594.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定