【问题标题】:How to create a tuple with a method that returns the n'th element [duplicate]如何使用返回第 n 个元素的方法创建元组 [重复]
【发布时间】:2018-06-29 07:52:28
【问题描述】:

代码:

    template< typename... TemplateArguments >
    class Tuple
    {}

    template< typename ExposedType, typename... TemplateArguments >
    class Tuple< ExposedType, TemplateArguments... > : public Tuple< TemplateArguments... >
    {
    public:

        template < uint64_t ArgumentNumber >
        typename std::enable_if< ArgumentNumber != 1, typename TypeHolder< ArgumentNumber, Tuple< ExposedType, TemplateArguments... > >::m_type& >::m_type Entry();

        template < uint64_t ArgumentNumber >
        typename std::enable_if< ArgumentNumber == 1, typename TypeHolder< 1, Tuple< ExposedType > >::m_type& >::m_type Entry();

        ExposedType m_data;

    };

    template< uint64_t ArgumentNumber, typename ExposedType >
    class TypeHolder
    {};

    template< typename ExposedType, typename... TemplateArguments >
    class TypeHolder< 1, Tuple< ExposedType, TemplateArguments... > >
    {
    public:

        typedef ExposedType m_type;

    };

    template< uint64_t NumberOfArguments, typename ExposedType, typename... TemplateArguments >
    class TypeHolder< NumberOfArguments, Tuple< ExposedType, TemplateArguments... > >
    {
    public:

        typedef typename TypeHolder< NumberOfArguments - 1, Tuple< TemplateArguments... > >::m_type m_type;

    };

以及入口方法的实现:

    template< typename ExposedType, typename... TemplateArguments >
    template < uint64_t ArgumentNumber >
    typename std::enable_if< ArgumentNumber != 1, typename TypeHolder< ArgumentNumber, Tuple< ExposedType, TemplateArguments... > >::m_type& >::m_type Tuple< ExposedType, TemplateArguments... >::Entry() 
    {
        Tuple< TemplateArguments... >& baseTuple = *this;

        return ( baseTuple.EntryL< ArgumentNumber - 1 >() );
    }

    template< typename ExposedType, typename... TemplateArguments >
    template < uint64_t ArgumentNumber >
    typename std::enable_if< ArgumentNumber == 1, typename TypeHolder< 1, Tuple< ExposedType > >::m_type& >::m_type Tuple< ExposedType, TemplateArguments... >::Entry() 
    {
        return ( m_data );
    }

重点是创建一个元组对象,该对象具有返回对所需元素的引用的方法,使用时应该是这样的:

Tuple< int, int > tuple_1( 8, 10 );

tuple_1.Entry< 1 >() = 14;

尝试编译时出现错误:

error: expected primary-expression before ‘)’ token

return ( baseTuple.Entry< ArgumentNumber - 1 >() );
                                                ^

谁能帮助解决这个问题?或展示如何做到这一点的正确方法?

谢谢!!

编辑:

如果我添加 true 就可以了:

return ( baseTuple.EntryL< ArgumentNumber - 1 >( true ) );

为什么??

【问题讨论】:

  • 以前有人问过这个问题。但我找不到帖子......解决方案是制作一些额外的模板类。
  • 我正在尝试使用各种编译器编译您的代码,但它不完整。你能给个minimal reproducible example吗?
  • 用 std::enable_if 替换 CreateTypedef 就可以了,我的错
  • 不,不是good link now
  • 不客气,虽然我什么也没做。仍在弄清楚如何让您的代码编译。例如,必须添加Tuple(ExposedType data, TemplateArguments... args) : Tuple(&amp;args...), m_data(data) {}。并将Typeholder的定义放在Tuple的特化之上。附: PM 使用@而不是#的人。

标签: c++ tuples metaprogramming


【解决方案1】:

依赖名称,你应该添加template

return baseTuple.template Entry<ArgumentNumber - 1>();

【讨论】:

  • 有趣。 VC++ 接受没有template 的行,但 Gcc 不接受。 VC++为什么这么奇怪?
  • @JHBonarius:VC 没有进行 2 个阶段的查找。 (MSVC 2017 应该更加合规,而不是经过测试)。
  • 我测试了MSVC2017 v15.7
猜你喜欢
  • 2015-02-18
  • 2015-10-23
  • 2021-08-21
  • 1970-01-01
  • 2021-10-03
  • 2015-12-03
  • 1970-01-01
  • 2012-04-05
  • 2018-04-18
相关资源
最近更新 更多