簡體   English   中英

從模板 class 的 std::tuple 中提取類型列表

[英]Extract list of types from std::tuple for template class

假設我有以下 class

class Example {
public:
    using value_type = std::tuple<
        uint8_t,
        uint8_t,
        uint16_t
    >;

private:
    value_type _value;
};

現在,我希望能夠基於這種類型創建另一個 class,它將每個類類型包裝在另一種類型中。 基於將每種類型包裝在模板化的 class 中的可變參數模板中,我知道我可以通過以下方式完成一半的目標:

template <typename T>
class Wrapper;

template <typename ... ARGS>
class ExampleWrapper {
private:
    std::tuple<Wrapper<ARGS>...> _args;
};

但是,如果我只知道T ,我不知道如何獲得ARGS ,其中T是示例。 我希望能夠使用ExampleWrapper ,如下所示:

ExampleWrapper<Example> myWrapper;

您可以使用模板部分專業化來獲取ARGS

template <typename T>
class Wrapper;

template <typename Tuple>
class ExampleWrapper;

template <typename ... ARGS>
class ExampleWrapper<std::tuple<ARGS...>> {
private:
    std::tuple<Wrapper<ARGS>...> _args;
};

然后:

ExampleWrapper<Example::value_type> myWrapper;

制作 static function 以返回所需的類型並在其上使用decltype

template <typename T>
class Wrapper{};

template<class T>
class ExampleWrapper {
    public:
    template<typename ...Args>
    static std::tuple<Wrapper<Args>...> fnc(std::tuple<Args...>);  
    using value_type = decltype( fnc( std::declval<typename T::value_type>() ) );

    private:
    value_type _args;  
};

template<typename T>
void test(T){ std::court << __PRETTY_FUNCTION__; }

int main(){
    ExampleWrapper<Example>::value_type a;
    test(a); /* void t(T) [with T = std::tuple<Wrapper<unsigned char>,
                                               Wrapper<unsigned char>,
                                               Wrapper<short unsigned int> >] 
              */
// The `T` in the above example is the type of `ExampleWrapper<Example>::_args`

}

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM