【发布时间】: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(&args...), m_data(data) {}。并将Typeholder的定义放在Tuple的特化之上。附: PM 使用@而不是#的人。
标签: c++ tuples metaprogramming