【问题标题】:How to get a tuple based on list of template templates of variable size in C++?如何根据 C++ 中可变大小的模板模板列表获取元组?
【发布时间】:2016-11-13 16:36:35
【问题描述】:

我创建了一个模板类,它接受两个普通模板参数(如 int 或 double)并从中派生了几个其他类:

template <typename A, typename B>
class IClassBase {...}

template <typename B>
class Derived1Class : public IClassBase<std::string, B> {...}

template <typename B>
class Derived2Class : public IClassBase<std::string, B> {...}

我需要设计一个结构,允许编译器根据模板类型列表及其参数(上面代码 sn-p 中的 B 类型)构建 std::tuple。

所以给出下面的列表

Derived1Class<int>, Derived1Class<double>, Derived2Class<bool>, Derived2Class<std::string>

编译器应该推断出以下元组:

std::tuple<int, double, bool, std::string>

这是否可能,如果可以,如何在 C++ 中完成?

提前致谢)

【问题讨论】:

    标签: c++ stl tuples variadic-templates generic-programming


    【解决方案1】:

    这是否可能,如果可以,如何在 C++ 中完成?

    在 C++ 中一切皆有可能。尤其是当前的 C++ 标准。使用 gcc 6.2 测试。

    #include <tuple>
    #include <string>
    
    template<typename template_type> class extract_param;
    
    template<template<typename T> typename template_param, typename template_param_t>
    class extract_param<template_param<template_param_t>> {
    
    public:
        typedef template_param_t type_t;
    };
    
    template<typename ...Args>
    using extract_tuple=std::tuple<typename extract_param<Args>::type_t...>;
    
    
    template<typename T> class sometemplate {};
    
    int main()
    {
        extract_tuple< sometemplate<int>, sometemplate<std::string>> tuple;
    
        int &intref=std::get<0>(tuple);
        std::string &stringref=std::get<1>(tuple);
    
        return 0;
    }
    

    【讨论】:

    • 老实说,尽管这可能有效,但代码非常不可读且难以理解,我认为应该避免这种情况:D
    • 如果您认为这不可读,请选择任何标题,&lt;vector&gt;&lt;algorithm&gt;,然后尝试自己阅读。从来没有人指责 C++ 非常清晰。由于 stackoverflow.com 上的 C++ 标签是...的见证人...
    • 是的,我可能只是不习惯 C++ 语法的混乱程度:D
    • 标记我的话。经过 20 年的 C++ 编程,上面的代码对你来说应该是一首诗。
    • @SamVarshavchik 感谢您的回复,它真的很有帮助。但是,我还想介绍另一个用例。 template &lt;typename T, template &lt;T, typename&gt; typename ... Args&gt; class A{extract_tuple&lt;Args&gt; tuple;}您能否评论一下您的方法是否可以实现?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    相关资源
    最近更新 更多