c++ - 如何使用返回第 n 个元素的方法创建元组

标签 c++ tuples metaprogramming

<分区>

代码:

    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 ) );

为什么??

最佳答案

依赖名称,你应该添加template:

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

关于c++ - 如何使用返回第 n 个元素的方法创建元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51096874/

相关文章:

c++ - C++ 中的可变参数模板和逗号分隔的字符串

c++ - 获取 CImage 的子图像

java - Java 和 Python 中的数据结构及其实现 : Lists, 数组、元组

python - 转换为嵌套在列表列表中的元组列表

namespaces - 为覆盖范围非常大的测试构建 RSpec 文件结构和代码?

python - 动态 __init_subclass__ 方法的参数绑定(bind)

c++ - 海量数据分析

C++11: "auto"关键字是否完全检索 cv 限定符?我有矛盾的样本

c++ - 如何显式管理异构类型(和大小)的多个池分配器?

python - 获取 "' 元组'对象的列表的变异元组不支持项目分配“