我将如何实现一个函数来提取这个 class 的元素?
How would I implement a function to extract the elements of this class?
为了好玩,我一直在用 C++ 实现元组,但由于下面的 class 对其进行了修改,所以我只能通过使用模板轻松提取每个元素指数。类似于 std::get.
TL;DR:提取元组内元素的实现方式如何?
template<typename first_t, typename ... arg_v>
class Tuple : public Tuple<arg_v ...>
{
public:
Tuple()
{
}
Tuple(const first_t&& A) :
element(A)
{
}
Tuple(const first_t& A, arg_v& ... args) :
element(A), Tuple<arg_v ...>::Tuple(args ...)
{
}
Tuple(const first_t&& A, arg_v&& ... args) :
element(A), Tuple<arg_v ...>::Tuple(args ...)
{
}
first_t element;
};
template<typename last_t>
class Tuple<last_t>
{
public:
Tuple()
{
}
Tuple(const last_t& A) :
element(A)
{
}
Tuple(const last_t&& A) :
element(A)
{
}
last_t element;
};
我用了递归的方法。
我知道指向 void
的指针是邪恶的,但我们不知道将返回哪种类型,只有使用代码的人知道;转换为我们想要的类型只会由最后一个 get
.
执行
请记住,此代码会在不进行任何检查的情况下将 void*
转换为您想要的内容。
class Tuple : public Tuple<arg_v ...>
{
template<typename T>
void get(int index, T& out)
{
out = *static_cast<T*>(get(index));
}
void* get(unsigned int index)
{
if (index == 0)
return &element;
else
return Tuple<arg_v ...>::get(index - 1);
}
};
class Tuple<last_t>
{
void* get(unsigned int)
{
return &element;
}
};
为了好玩,我一直在用 C++ 实现元组,但由于下面的 class 对其进行了修改,所以我只能通过使用模板轻松提取每个元素指数。类似于 std::get.
TL;DR:提取元组内元素的实现方式如何?
template<typename first_t, typename ... arg_v>
class Tuple : public Tuple<arg_v ...>
{
public:
Tuple()
{
}
Tuple(const first_t&& A) :
element(A)
{
}
Tuple(const first_t& A, arg_v& ... args) :
element(A), Tuple<arg_v ...>::Tuple(args ...)
{
}
Tuple(const first_t&& A, arg_v&& ... args) :
element(A), Tuple<arg_v ...>::Tuple(args ...)
{
}
first_t element;
};
template<typename last_t>
class Tuple<last_t>
{
public:
Tuple()
{
}
Tuple(const last_t& A) :
element(A)
{
}
Tuple(const last_t&& A) :
element(A)
{
}
last_t element;
};
我用了递归的方法。
我知道指向 void
的指针是邪恶的,但我们不知道将返回哪种类型,只有使用代码的人知道;转换为我们想要的类型只会由最后一个 get
.
请记住,此代码会在不进行任何检查的情况下将 void*
转换为您想要的内容。
class Tuple : public Tuple<arg_v ...>
{
template<typename T>
void get(int index, T& out)
{
out = *static_cast<T*>(get(index));
}
void* get(unsigned int index)
{
if (index == 0)
return &element;
else
return Tuple<arg_v ...>::get(index - 1);
}
};
class Tuple<last_t>
{
void* get(unsigned int)
{
return &element;
}
};